11

重複の可能性:
C# で short から byte にキャストするとどうなりますか?

最小/最大バイトの範囲外にある場合、値をバイトにキャストするときに何が起こっているのか誰かが説明できますか? 整数値を取り、それを 255 でモジュロしているようです。これが例外をスローしない理由を理解しようとしています。

int i = 5000;
byte b = (byte)i;

Console.WriteLine(b);  // outputs 136
4

5 に答える 5

10

5000 は 4 バイト (int) (16 進数) として表されます。

|00|00|13|88|

これをバイトに変換すると、最後の 1 バイトだけが使用されます。

理由: IL レベルでは、 int をバイトに変換するオーバーフローが発生した場合に上位ビットを切り捨てるconv.u1演算子が使用されます。( conv.u1ドキュメントの備考セクションを参照してください)。

|88|

これは 10 進数で 136 です

于 2012-09-24T21:20:37.187 に答える
5

何が起こっているかというと、システムが適合させるために最上位バイトを削除しているということです。何が起こっているのかについてのかなり良い説明については、この StackOverFlow answerを見てください。

于 2012-09-24T21:12:23.190 に答える
3

これが例外をスローしない理由を理解しようとしています。

オーバーフロー チェックのデフォルト設定はoffであるためです。

これを試してください、それはスローします:

checked
{
    int i = 5000;
    byte b = (byte)i;

    Console.WriteLine(b);
}

短い形式は次のとおりです。

int i = 5000;
byte b = checked ( (byte)i );    
Console.WriteLine(b);
于 2012-09-24T21:17:24.357 に答える
1

いつも5000%256 = 136のように overfull を取得します。

于 2012-09-24T21:12:40.787 に答える
0

MSDNでも説明されています。オーバーフローが発生した場合は、checked()を使用して例外をスローします。こちらもお読みください: MSDN: Chapter 5: More About Variables

于 2012-09-24T21:16:27.413 に答える