このコードを考えると:
int x = 20000;
int y = 20000;
int z = 40000;
// Why is it printing WTF? Isn't 40,000 > 32,767?
if ((x + y) == z) Console.WriteLine("WTF?");
そして、int が -32,768 から +32,767 を保持できることを知っています。これがオーバーフローを引き起こさないのはなぜですか?
このコードを考えると:
int x = 20000;
int y = 20000;
int z = 40000;
// Why is it printing WTF? Isn't 40,000 > 32,767?
if ((x + y) == z) Console.WriteLine("WTF?");
そして、int が -32,768 から +32,767 を保持できることを知っています。これがオーバーフローを引き起こさないのはなぜですか?
C#では、型は常に32ビットの符号付き型にint
マップされます。Int32
+はデフォルトでを返すため、を使用short
してもオーバーフローしません。これを---にキャストすると、オーバーフローした値が得られます。ただし、例外は発生しません。ビヘイビアーを使用して例外を取得できます。short
short
int
int
short
(short)(x + y)
checked
using System;
namespace TestOverflow
{
class Program
{
static void Main(string[] args)
{
short x = 20000;
short y = 20000;
short z;
Console.WriteLine("Overflowing with default behavior...");
z = (short)(x + y);
Console.WriteLine("Okay! Value is {0}. Press any key to overflow " +
"with 'checked' keyword.", z);
Console.ReadKey(true);
z = checked((short)(x + y));
}
}
}
checked
(およびunchecked
)に関する情報は、MSDNで見つけることができます。オーバーフローのチェックは無視するよりも少し遅いため、基本的にパフォーマンスに要約されます(これがデフォルトの動作である理由ですが、一部のコンパイラ/構成では、最初の割り当てunchecked
で例外が発生することは間違いありません)。z
http://msdn.microsoft.com/en-us/library/5kzh1b5w.aspx
タイプ: int 範囲: -2,147,483,648 ~ 2,147,483,647
C# では、Int は 4 バイトです。したがって、2^31 または 2,147,483,648 で最大になります。2 バイトの整数が必要な場合は、int の代わりに short を使用します。
.NET の int は、-2,147,483,648 から 2,147,483,647の範囲の符号付き 32 ビット数値であるためです。
参照: http://msdn.microsoft.com/en-us/library/5kzh1b5w(VS.80).aspx
まず、コードはintの範囲内にあります...ただし、範囲内になかった場合も文句はありません... cozifcheckでX+Yを実行した後、変数に値を割り当てることはありません。 ..。。
X * Yを実行している場合、それが計算され、結果が長い値になり、変数Zの値が取得されて長い値に昇格され、両方が比較されると仮定します...低い範囲からのキャストを覚えておいてくださいプリミティブから上位範囲のプリミティブ値は暗黙的です。
int x = 200000; //In your code it was 20000
int y = 200000; //In your code it was 20000
int z = 40000;
// Why is it printing WTF? Isn't 40,000 > 32,767?
// Note: X + Y = 200000 and not < 32,767
// would pass compiler coz you are not assigning and values are compared as longs
// And since it's not equals to 40,000 the WTF did not got printed
if ((x + y) == z) Console.WriteLine("WTF?");
// And x * y >= z is true WTF MULTIPLY got printed
if ((x * y) >= z) Console.WriteLine("WTF MULTIPLY?");
// Compiler would fail since x can't hold 40,00,00,00,000
x = x * y;
int は 32 ビットであるため、最大 ±2GB の値を保持します。
int のサイズは 4 バイトであるため、少なくとも 2^31 (約 20 億) を保持できます。
intキーワードは、-2,147,483,648 ~ 2,147,483,647 の範囲の整数を保持できる.NET Framework Int32 型にマップされます。
C# int (System.Int32)は 32 ビットで、この値を問題なく格納できます。
結果を「WTF?」として出力するように指定されています。.次に、他の値をどのように表示する必要がありますか。
Int は int32 を意味し、その範囲は –2147483648 から 2147483647 です。int16 の範囲が与えられます:–32768 から 32767
これがエラーをスローしない理由です
上記はすべて真実ですが、2^32 より大きい数値を割り当てるとコンパイルされないことを知っておくことが重要です。