48

在 C# 中,我看到了

-1 * int.MinValue == int.MinValue

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

4

5 回答 5

60

这不是错误。

int.MinValue * -1大于可以容纳1int.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

于 2010-09-01T21:43:09.617 回答
9

这不是错误,这是溢出。

二进制补码表示中,可表示数的空间不是对称的。不能表示最小整数的反面。计算它会溢出并再次为您提供相同的数字。

于 2010-09-01T21:43:57.097 回答
8
int i = -1 * int.MinValue;

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

error CS0220: The operation overflows at compile time in checked mode
于 2010-09-01T21:44:04.813 回答
2

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

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

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

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

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

于 2010-09-01T21:45:36.650 回答
2

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

于 2010-11-05T23:51:59.053 回答