2

これによりオーバーフローが発生しますか?そうでない場合は、なぜですか? 「バイト」タイプのサイズは依然として 8 ビットのままであり、オーバーフローが発生しない場合、それは「キャスト」によってメモリ内の「バイト」タイプの割り当てが 8 ビットから 32 ビットに増加することを意味しますか?..最終的に型キャスト [暗黙的] は実際にどのように機能しますか?

//a part of c# program

byte b = 100;
b = (Byte)(b + 200);
Console.WriteLine("VALUE OF BYTE TYPE'S OBJECT {0}",b);

//end 
4

5 に答える 5

3

式が宛先タイプの範囲外の値を生成する場合、結果は切り捨てられます。

コードでオーバーフローが発生するかどうかを知りたい場合は、チェック ステートメント ( msdn )を使用する必要があります。

checked
{
    byte b = 100;
    b = (Byte)(b + 200);
    Debug.WriteLine("VALUE OF BYTE TYPE'S OBJECT {0}", b); 
}
于 2013-07-28T19:55:09.973 に答える
2

暗黙の変換はb+200. MSDN のドキュメントにあるように、これは暗黙のうちに 300 に等しい int になります。次に、バイトに明示的にキャストすると、8 ビットに切り捨てられます。checkedkmatyaszek が提案するように、ブロック内で実行時にオーバーフロー チェックを有効にすることができます。

于 2013-07-28T19:57:52.093 に答える
1

C# 言語仕様を参照してください。

7.6.12 チェックされた演算子とチェックされていない演算子


以下の操作は、checked およびuncheckedの演算子とステートメントによって確立されたオーバーフロー チェック コンテキストの影響を受けます
。タイプ。

上記の操作のいずれかが生成する結果が大きすぎて宛先の型で表すことができない場合、操作が実行されるコンテキストによって結果の動作が制御さ れます
。 -宛先タイプに適合しないオーダービット * 。

チェックまたはチェックされていない演算子またはステートメントで囲まれていない非定数式 (実行時に評価される式)の場合、 外部要因 (コンパイラ スイッチや実行環境の構成など) によって要求されない限り、既定のオーバーフロー チェック コンテキストはチェックされません。チェック評価。

これは -(byte)から明示的な数値変換を行います。これはint、デフォルトではチェックされていないコンテキストで実行されるため、結果が切り捨てられます。

于 2013-07-28T20:13:29.113 に答える
1

以下のように書かれたスニペットを検討してください。

byte b = 100;
Console.WriteLine(b);

b = (Byte)(b + 200);

Console.WriteLine(b);

このコードはそれぞれ と を出力10044ます。このコードが実行されると、実際に起こっていることは、加算操作の結果が 8 ビット値よりも大きくなるということですが、プログラムは気にせず、最後の 1 バイトだけを取得します (たとえば、32 ビット値の最後の 8 ビット)。

編集:その操作を実行するときにオーバーフローエラー/例外が発生しないことを忘れないでください。次のコードを検討してください。

b = Byte.MaxValue;
Console.WriteLine(b);
b++;
Console.WriteLine(b);

どの出力255& 0.

ただし、このコードは次のようになります。

b = Byte.MaxValue;
Console.WriteLine(b);
b = checked((byte)(b + 1));
Console.WriteLine(b);

見る:

于 2013-07-28T19:54:13.190 に答える
1

いいえ、明示的なキャストを実行すると(暗黙的にintになるため、そうする必要があります)、コンパイラーに「はい、私が何をしているのか知っているので、とにかくそれを実行してください」と言うようなものなので、結果は(300 - 256 = 44) であるため、オーバーフロー例外を発生させるには、適切な try/catch ブロックに次のようなチェック済みキーワードを追加する必要があります。

try
{
   byte b = 100;
   b = checked((byte)(b + 200));
   Console.WriteLine("VALUE OF BYTE TYPE'S OBJECT {0}", b);
}
catch(OverFlowException e)
{
   Console.WriteLine(e.Message);
}
于 2013-07-28T20:00:23.910 に答える