在C#中,我看到了
-1 * int.MinValue == int.MinValue
这是一个错误吗?当我试图实现搜索树时,它真的搞砸了我。我最终使用(int.MinValue + 1)
,以便我可以正确否定它。
答案 0 :(得分:57)
这不是错误。
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
大于{{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)
不,这不是一个错误。它是二进制补码整数运算的本质。
例如,让我们取一个有符号的字节值,该值介于-128
和127
之间。
127(0x7f)+1 = 128(0x80)
。但是,0x80
实际上是-128
的二进制表示。
因此,对于一个字节128(0x80) = -128(0x80)
所以-128(0x80) * -1 = 128(0x80) = -128(0x80)
答案 4 :(得分:2)
在其上放置一个选中的区域,然后看到“bug”演变为异常。或者尝试使用VB.NET(据我所知,默认情况下,这与C#不同)。