1

変数を in に明示的にキャストしてから plus 演算子を使用しますが、それでも 44 を返します。変数を int に明示的にキャストすると、なぜこのようなことが起こるのか知りたいのです。

byte b = 100;
b = (byte)(b +200);

なぜこれを使用するのですか? 結果は 255 です。

byte b = 100;
b = (byte)(b + 155);
4

2 に答える 2

6

これを分割しましょう:

byte b = 100;
int tmp = (int) b + (int) 200;
b = (byte) b;

これで値は300になりますtmpが、これは。として表すことはできませんbyte。(チェックされていないコンテキストで)キャストするとbyte、44になります。

C#5仕様の関連ビット、セクション6.2.1:

明示的な数値変換により、情報が失われたり、例外がスローされたりする可能性があります。明示的な数値変換は次のように処理されます。

  • 積分型から別の積分型への変換の場合、処理は、変換が行われるオーバーフローチェックコンテキスト(§7.6.12)に依存します。
    • チェックされたコンテキストでは、ソースオペランドの値がデスティネーションタイプの範囲内にある場合、変換は成功しますが、ソースオペランドの値がデスティネーションタイプの範囲外にある場合、System.OverflowExceptionをスローします。
    • チェックされていないコンテキストでは、変換は常に成功し、次のように進行します。
      • ソースタイプがデスティネーションタイプよりも大きい場合、ソース値はその「余分な」最上位ビットを破棄することによって切り捨てられます。結果は、宛先タイプの値として扱われます。

その最後の弾丸はまさにここで起こっていることです。

于 2013-03-03T19:55:32.233 に答える
0

「100+200」の結果は300であるため、300は(キャスト先の)バイトに収まらないため、上位ビットは破棄され、44が残ります。

何が起こると思っていましたか?

于 2013-03-03T19:55:22.507 に答える