【问题标题】:UInt64 and "The operation overflows at compile time in checked mode" - CS0220UInt64 和“在检查模式下编译时操作溢出” - CS0220
【发布时间】:2012-04-27 09:00:25
【问题描述】:

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

UInt64.MaxValue 18446744073709551615

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

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

为什么会这样?

【问题讨论】:

  • 啊是的 - 这绝对可以解释!谢谢大家!

标签: c# math logic uint64


【解决方案1】:

因为:

UInt64 value1 = 1073741824 * 8;

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

UInt64 value1 = 1073741824UL * 8;

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

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

【讨论】:

    【解决方案2】:

    1073741824int,而不是 UInt64
    因此,您的乘法超出了 32 位有符号整数的限制。

    ul(无符号长整数)后缀添加到任一操作数。

    【讨论】:

      【解决方案3】:

      您遇到了错误,因为您使用的是int 而不是long 1073741824 仍为 intint 的最大值为 2147483647)。
      所以在第一种情况下,你会得到int 类型的溢出。
      将第一个表达式更改为:

      UInt64 value1 = 1073741824L * 8;
      

      问题就会消失。

      【讨论】:

      • 没有注意到您使用无符号值进行操作。对于 unsigned long,您应该使用 1073741824UL 而不是 1073741824L。
      猜你喜欢
      • 1970-01-01
      • 2014-08-14
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 2015-09-15
      • 2021-09-04
      • 1970-01-01
      相关资源
      最近更新 更多