-1 * int.MinValue == int.MinValue ??这是一个错误吗?

时间:2010-09-01 21:41:15

标签: c# .net integer-overflow

在C#中,我看到了

-1 * int.MinValue == int.MinValue

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

5 个答案:

答案 0 :(得分:57)

这不是错误。

int.MinValue * -1 1大于int.MaxValue可以容纳的int.MinValue。因此,数字回绕到-2,147,483,648

这基本上是由整数溢出引起的。

Int32.MinValue:

  

此常量的值为2,147,483,647

Int32.MaxValue:

  

此常量的值为-2,147,483,648 * -1 = 2,147,483,648

所以,1 Int32.MaxValue大于{{1}}。

答案 1 :(得分:9)

这不是一个错误,它是一个溢出。

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

答案 2 :(得分:8)

int i = -1 * int.MinValue;

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

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

答案 3 :(得分:2)

不,这不是一个错误。它是二进制补码整数运算的本质。

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

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

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

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

答案 4 :(得分:2)

在其上放置一个选中的区域,然后看到“bug”演变为异常。或者尝试使用VB.NET(据我所知,默认情况下,这与C#不同)。