这感觉像是一个愚蠢的问题,但我似乎看不到答案。我有一个 UInt64,它的最大值应该为
UInt64.MaxValue 18446744073709551615
但是,当我尝试分配一个中等大小的数字时,我收到"操作在编译时在检查模式下溢出"的溢出错误。如果我将其包装在"未选中"的块中,那么它会编译,并像此变量为零一样运行:
UInt64 value1 = 1073741824 * 8; // Compile error CS0220
UInt64 value2 = 8589934592; // Actual value - no error
为什么会这样?
因为:
UInt64 value1 = 1073741824 * 8;
将算术作为有符号 32 位整数进行,然后将其转换为 ulong
.尝试:
UInt64 value1 = 1073741824UL * 8;
UL
表示文字是无符号的长整型。有关文字后缀的更多信息,请参阅 C# 规范的第 2.4.4 节:
如果文本后缀为 UL、Ul、uL、ul、LU、Lu、lU 或 lu,则其类型为 ulong
1073741824
是一个int
,而不是一个UInt64
。
因此,您的乘法会溢出 32 位有符号整数的限制。
将ul
(无符号长)后缀添加到任一操作数。
您遇到了错误,因为您使用int
而不是long
1073741824仍然是int
(int
的最大值为 2147483647)。
因此,在第一种情况下,您会int
溢出类型。
将第一个表达式更改为:
UInt64 value1 = 1073741824L * 8;
问题就会消失。