7

.net プログラムで奇妙な動作を目撃しています:

Console.WriteLine(Int64.MaxValue.ToString());
// displays 9223372036854775807, which is 2^63-1, as expected

Int64 a = 256*256*256*127; // ok

Int64 a = 256*256*256*128; // compile time error : 
//"The operation overflows at compile time in checked mode"
// If i do this at runtime, I get some negative values, so the overflow indeed happens.

Int64.MaxValue は 64 ビットを使用していることを確認しているように見えますが、Int64 が Int32 のように動作するのはなぜですか?

関連する場合、私は 32 ビット OS を使用しており、ターゲット プラットフォームは「すべての CPU」に設定されています。

4

2 に答える 2

20

RHS はInt32値のみを使用しているため、演算全体がInt32算術を使用して実行され、Int32 結果が long に昇格されます。

これを次のように変更します。

Int64 a = 256*256*256*128L;

そしてすべてがうまくいくでしょう。

于 2009-05-06T13:30:51.917 に答える
4

使用する:

Int64 a = 256L*256L*256L*128L;

L サフィックスは Int64 リテラルを意味し、サフィックスがない場合は Int32 を意味します。

あなたが書いたもの:

Int64 a = 256*256*256*128

意味:

Int64 a = (Int32)256*(Int32)256*(Int32)256*(Int32)128;
于 2009-05-06T13:33:35.700 に答える