変数を in に明示的にキャストしてから plus 演算子を使用しますが、それでも 44 を返します。変数を int に明示的にキャストすると、なぜこのようなことが起こるのか知りたいのです。
byte b = 100;
b = (byte)(b +200);
なぜこれを使用するのですか? 結果は 255 です。
byte b = 100;
b = (byte)(b + 155);
変数を in に明示的にキャストしてから plus 演算子を使用しますが、それでも 44 を返します。変数を int に明示的にキャストすると、なぜこのようなことが起こるのか知りたいのです。
byte b = 100;
b = (byte)(b +200);
なぜこれを使用するのですか? 結果は 255 です。
byte b = 100;
b = (byte)(b + 155);
これを分割しましょう:
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をスローします。
- チェックされていないコンテキストでは、変換は常に成功し、次のように進行します。
- ソースタイプがデスティネーションタイプよりも大きい場合、ソース値はその「余分な」最上位ビットを破棄することによって切り捨てられます。結果は、宛先タイプの値として扱われます。
その最後の弾丸はまさにここで起こっていることです。
「100+200」の結果は300であるため、300は(キャスト先の)バイトに収まらないため、上位ビットは破棄され、44が残ります。
何が起こると思っていましたか?