2016-03-20 1 views
-2

は私が何を意味、私は2つの変数の加算によってオーバーフローが発生するかどうかを確認できますか?

byte b1 = 255, 
    b2 = 1; 
Console.WriteLine("Does {0} + {1} oveflow? {2}", b1, b2, Overflows(b1,b2) ? "Yes : "No"); // Answer should be "Yes" here 

のように使用することができ、一般的な手順

public bool Overflows<T> (T a, T b) 
{ 
    // returns true or false based on whether 
    // a + b overflows 
} 

を構築することができ???

byteの場合は、(a+b) < a(a+b) < bのいずれかを見ることができます。例えば2551より小さい場合、結果は0となるため、255+1がオーバーフローすることがわかります。それとも、私はより大きなデータ型にそれらをキャストし

return ((int)a + (int)b) > (int)Byte.MaxValue; 

のようにチェックしますが、それは+オペレータを持っているすべての数値タイプでは動作しませんすることができます。

public bool Overflows<T> (T a, T b) 
{ 
    { 
     // the 'checked' keyword ensures an OverflowException is thrown 
     // as a result of a real integer overflow happening 
     c = checked(a + b); // * with 'T' this won't compile, see below 
     return false; 
    } 
    catch (System.OverflowException e) 
    { 
     return true; 
    } 
} 

しかし、ジェネリック型パラメータTのために、コンパイラは+演算子を理解していない: -

答えて

4

最も簡単には明示的にオーバーフローをチェックし、関連する例外(下記参照擬似コード)をキャッチすることです。ここでは、2つのオプション:

  1. 宣言方法のすべての可能なバージョン、すなわちOverflows(int, int)Overflows(byte, byte)など
  2. 使用タイプの比較とキャスト:

    if (typeof(T) == typeof(int)) 
        int i = checked((int)a + (int)b); 
    else if (typeof(T) == typeof(byte)) 
        byte b = checked((byte)a + (byte)b); 
    … etc. 
    
関連する問題