【问题标题】:.NET / C# - Allow overflowing of integers.NET / C# - 允许整数溢出
【发布时间】:2009-12-30 03:22:38
【问题描述】:

最近我开始制作一个物品容器,每次用户尝试将物品添加到容器中。如果以某种方式存在相同的项目类型,它会将它们堆叠在一起,但有一个限制,即 int.MaxValue 如果我尝试过:

if (2147483647 + 2147483647 > int.MaxValue)

这会给我以下错误:

The operation overflows at compile time in checked mode

所以我尝试像这样使用未选中的关键字:

unchecked
{
     if (2147483647 + 2147483647 > int.MaxValue)
     {
     }
}

但这根本没有显示触发 if 语句(我猜它是包裹在逻辑与运算符周围的?)

还有其他方法可以做到这一点吗? (不使用 int64 等)

【问题讨论】:

  • 你为什么要添加两个等于 int.MaxValue 的常量,并将它们与 int.MaxValue 进行比较?
  • @GregS,这只是一个例子。
  • 确切的问题是什么,当然有两个 int.MaxValues 大于 int.MaxValue。
  • 您是否担心这一点,以防有人将超过 20 亿个相同类型的项目添加到您的列表中?这真的会发生吗?

标签: c# .net integer overflow


【解决方案1】:

如果一个 int 操作溢出它不会测试大于Int32.MaxValue

如果您希望该条件为真,请使用 long。

if (2147483647L + 2147483647L > int.MaxValue) ...

或者,使用uints。

if (2147483647U + 2147483647U > (uint)int.MaxValue) ...

【讨论】:

  • 或者您可以注意到,编译器无疑会注意到,条件始终为真。
【解决方案2】:

如果您不需要位空间的负半部分,请尝试将两者都转换为 uint(无符号)。相同的位宽,只是在 Int.MaxValue 之后不会滚动为负数(例如,它是 int.MaxValue 大小的 2 倍)

【讨论】:

    【解决方案3】:

    【讨论】:

    【解决方案4】:

    你的 if 条件没有得到的主要原因是因为 unchecked 块中的 int 溢出,添加 2147483647 + 2147483647 将导致 -2

    这就是你的 if 条件 2147483647 + 2147483647 > int.MaxValue 永远不会为真的原因,因为它会被评估为 -2 > int.MaxValue,这是不正确的。

    【讨论】:

      猜你喜欢
      • 2011-05-13
      • 1970-01-01
      • 2016-07-01
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多