为什么我的 .net Int64 行为像 Int32 一样?

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”。

2个回答

20

您的RHS只使用了Int32值,因此整个操作都是使用Int32算术执行的,然后将Int32结果提升为长整型。

请修改为以下内容:

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

一切都会好起来的。


1
你太厉害了Jon Skeet!你比我快大约10秒钟!:) - John Kraft
你并不蠢,只是一开始有点不直观。我曾经被这个问题咬过,当我期望“double res = someInt / otherInt”执行浮点数除法(但实际上它并没有),并且发现左边的值并不重要。 - Michael Stum
1
@Michael:不,我感到愚蠢是因为我知道这个问题。如果这发生在别人身上,我肯定会立刻发现问题!奇怪的是,重新审视一下可以改变一切!实际上,我发布的代码是我遇到的真实情况的简化版本,其中问题更难以发现。像我这样的人因为心中有“真正”的问题而产生偏见,所以除了我之外,每个人都能轻易地看出来。 - Brann

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;

建议使用大写后缀 L,因为它更容易识别,在某些字体中您甚至无法区分 1l - phuclv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接