-1 * int.MinValue == int.MinValue ?? 这是一个错误?
在C#中我看到了
-1 * int.MinValue == int.MinValue
这是一个错误? 当我试图实现一个search树时,它真的把我搞砸了。 我结束了使用(int.MinValue + 1)
以便我可以正确否定它。
这不是一个错误。
int.MinValue * -1
是1
大于int.MaxValue
可以容纳。 因此,数字回到int.MinValue
。
这基本上是由整数溢出引起的。
Int32.MinValue
:
这个常数的值是
-2,147,483,648
Int32.MaxValue
:
这个常数的值是
2,147,483,647
因此, -2,147,483,648 * -1 = 2,147,483,648
比Int32.MaxValue
1
。
这不是一个错误,这是一个溢出。
在二的补码表示中,可表示数字的空间是不对称的。 最小整数的反面不能被表示。 计算它溢出,并再次给你相同的数字。
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#)。