2012-07-22 9 views
12

おはよう!私は2バイトの変数を追加しようとしていて、奇妙な結果に気づいた。バイト+バイト=不明結果

byte valueA = 255; 
byte valueB = 1; 
byte valueC = (byte)(valueA + valueB); 

Console.WriteLine("{0} + {1} = {2}", valueA.ToString(), 
            valueB.ToString(), 
            valueC.ToString()); 

私はプログラムを実行しようとしたとき、それは、上記のコードに何が起こった

255 + 1 = 0 

を表示しますか?なぜコンパイラはOverflowExceptionを投げないのですか?どうすれば例外をキャッチできますか?私はVBの男であり、ゆっくりとC#に移行しています:)質問には申し訳ありません。

+1

さて、あなたのコードがオーバーフローしません。それはキャスト中にビットを破棄しますが、あなたはそれを明示的に要求しました。 –

答えて

17

デフォルトではC#コードはuncheckedなので、例外をスローするのではなく、オーバーフローが黙ってラップアラウンドするようになります。

checkedブロックにコードをラップすることで、わずかなパフォーマンスのヒストリを犠牲にして例外を得ることができます。

9

デフォルトでは、C#は算術演算のオーバーフローをチェックしないためです。 checkedでラップしようとすると例外がスローされます。

はこれを試してみてください。

byte valueA = 255; 
byte valueB = 1; 
byte valueC = (byte)(valueA + valueB); 

Console.WriteLine("Without CHECKED: {0} + {1} = {2}", valueA.ToString(), 
                 valueB.ToString(), 
                 valueC.ToString()); 

try 
{ 
    valueC = checked((byte)(valueA + valueB)); 
    Console.WriteLine("With CHECKED: {0} + {1} = {2}", valueA.ToString(), 
                 valueB.ToString(), 
                 valueC.ToString()); 
} 
catch (Exception e) 
{ 
    Console.WriteLine("With CHECKED: " + e.GetType()); 
} 

checked @ MSDN

+0

サンプルありがとう –

関連する問題