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 的行为就好像它们是 Int32 的一样,尽管 Int64.MaxValue 似乎确认它们使用的是 64 位?

如果相关,我使用的是 32 位操作系统,并且目标平台设置为“任何 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 回答