在 C# 中,我看到了
-1 * int.MinValue == int.MinValue
这是一个错误吗?当我尝试实现搜索树时,它真的把我搞砸了。我最终使用了(int.MinValue + 1),以便我可以正确地否定它。
在 C# 中,我看到了
-1 * int.MinValue == int.MinValue
这是一个错误吗?当我尝试实现搜索树时,它真的把我搞砸了。我最终使用了(int.MinValue + 1),以便我可以正确地否定它。
这不是错误。
int.MinValue * -1大于可以容纳1。int.MaxValue因此,数字回绕回int.MinValue。
这基本上是由整数溢出引起的。
这个常数的值是
-2,147,483,648
这个常数的值是
2,147,483,647
所以-2,147,483,648 * -1 = 2,147,483,648,1大于Int32.MaxValue。
这不是错误,这是溢出。
在二进制补码表示中,可表示数的空间不是对称的。不能表示最小整数的反面。计算它会溢出并再次为您提供相同的数字。
int i = -1 * int.MinValue;
除非您禁用检查,否则这甚至不会编译:
error CS0220: The operation overflows at compile time in checked mode
不,这不是错误。这是二进制补码整数算术的本质。
例如,让我们取一个介于-128和之间的有符号字节值127。
127(0x7f)+1 = 128(0x80). 然而,0x80实际上是 的二进制表示-128。
因此,对于一个字节,128(0x80) = -128(0x80)
所以-128(0x80) * -1 = 128(0x80) = -128(0x80)
在其上放置一个检查区域,然后查看“错误”演变为异常。或者尝试 VB.NET(据我回忆,它与 C# 不同的是默认检查)。