【问题标题】:-1 * int.MinValue == int.MinValue?? Is this a bug?-1 * int.MinValue == int.MinValue??这是一个错误吗?
【发布时间】:2011-04-07 01:06:18
【问题描述】:

在 C# 中我看到了

-1 * int.MinValue == int.MinValue

这是一个错误吗?当我尝试实现搜索树时,它真的把我搞砸了。我最终使用了(int.MinValue + 1),这样我就可以正确地否定它了。

【问题讨论】:

  • +1 非常有趣的问题:D
  • 这是我真的不明白的事情之一,为什么C#默认不勾选?

标签: c# .net integer-overflow


【解决方案1】:

这不是错误。

int.MinValue * -11 大于 int.MaxValue 可以容纳。因此,数字会回绕回int.MinValue

这基本上是整数溢出造成的。

Int32.MinValue:

这个常量的值是-2,147,483,648

Int32.MaxValue:

这个常量的值是2,147,483,647

所以,-2,147,483,648 * -1 = 2,147,483,6481 大于 Int32.MaxValue

【讨论】:

  • 整数数学太酷了! ;)
  • @Mark,在这种情况下,我认为这并不酷。令人困惑。
  • 取决于你如何看待它。从-x := ~x + 1Int32.MinValue1000 0000 0000 0000 0000 0000 0000 0000 的位角度来看,这实际上是相当合理的。 Int32 中的“32”确实指向那个方向:)
【解决方案2】:

这不是错误,这是溢出。

two's complement 表示中,可表示数字的空间不是对称的。不能表示最小整数的反面。计算它会溢出并再次给你相同的数字。

【讨论】:

  • 不到一秒钟,我以为你会说这不是错误,而是一项功能。 :D
【解决方案3】:
int i = -1 * int.MinValue;

除非您禁用检查,否则这甚至无法编译:

error CS0220: The operation overflows at compile time in checked mode

【讨论】:

【解决方案4】:

不,这不是错误。这是二进制补码整数算术的本质。

例如,让我们取一个介于-128127 之间的有符号字节值。

127(0x7f)+1 = 128(0x80)。然而,0x80 实际上是-128 的二进制表示。

因此,对于一个字节,128(0x80) = -128(0x80)

所以-128(0x80) * -1 = 128(0x80) = -128(0x80)

【讨论】:

    【解决方案5】:

    在其上放置一个检查区域,然后查看“错误”演变为异常。或者尝试 VB.NET(据我回忆,它与 C# 不同的是默认检查)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-28
      • 1970-01-01
      • 2012-09-18
      • 2012-03-25
      • 2010-12-22
      • 1970-01-01
      相关资源
      最近更新 更多