15

这感觉像是一个愚蠢的问题,但我似乎看不到答案。我有一个 UInt64,它的最大值应该是

UInt64.MaxValue 18446744073709551615

但是,当我尝试分配一个中等大小的数字时,我收到“在检查模式下编译时操作溢出”的溢出错误。如果我将它包装在一个“未经检查”的块中,那么它会编译并运行,就好像这个变量为零:

UInt64 value1 = 1073741824 * 8; // Compile error CS0220
UInt64 value2 = 8589934592;     // Actual value - no error

为什么会这样?

4

3 回答 3

29

因为:

UInt64 value1 = 1073741824 * 8;

将算术作为带符号的 32 位整数进行运算,然后将其转换为ulong. 尝试:

UInt64 value1 = 1073741824UL * 8;

UL意味着文字是无符号长的。有关文字后缀的更多信息,请参阅 C# 规范的第 2.4.4 节:

如果文字以 UL、Ul、uL、ul、LU、Lu、lU 或 lu 为后缀,则为 ulong

于 2012-04-15T23:54:42.883 回答
4

1073741824是一个int,不是一个UInt64
因此,您的乘法会溢出 32 位有符号整数的限制。

ul(unsigned long) 后缀添加到任一操作数。

于 2012-04-15T23:54:51.307 回答
1

你有一个错误,因为你操作int而不是long 1073741824 is still int(max for intis 2147483647)。
所以在第一种情况下,你会得到int类型溢出。
将第一个表达式更改为:

UInt64 value1 = 1073741824L * 8;

问题就会消失。

于 2012-04-15T23:59:19.710 回答