UInt64 和“操作在编译时在检查模式下溢出” - CS0220

本文关键字:溢出 下溢 CS0220 模式 操作 编译 UInt64 检查 | 更新日期: 2023-09-27 18:31:08

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

UInt64.MaxValue 18446744073709551615

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

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

为什么会这样?

UInt64 和“操作在编译时在检查模式下溢出” - CS0220

因为:

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而不是long1073741824仍然是intint的最大值为 2147483647)。
因此,在第一种情况下,您会int溢出类型。
将第一个表达式更改为:

UInt64 value1 = 1073741824L * 8;

问题就会消失。