为什么我的.net Int64的行为就好像它们是Int32的?

时间:2009-05-06 13:28:39

标签: .net 64-bit math integer-overflow int64

我正在见证.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的行为就像它们是Int32一样,虽然Int64.MaxValue似乎证实它们使用的是64位?

如果相关,我使用的是32位操作系统,目标平台设置为“任何CPU”

2 个答案:

答案 0 :(得分:20)

您的RHS仅使用Int32值,因此整个操作使用Int32算术执行,然后Int32 结果被提升为long。

将其更改为:

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

一切都会好的。

答案 1 :(得分: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;