在 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# 不同的是默认检查)。