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#に移行しています:)質問して申し訳ありません。

4

2 に答える 2

17

C# コードはunchecked既定で、オーバーフローが例外をスローするのではなく、サイレントにラップアラウンドするようになっています。

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

于 2012-07-22T14:28:15.047 に答える
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());
}

@MSDNをチェック

于 2012-07-22T14:40:02.517 に答える