-1 * int.MinValue == int.MinValue ?? 这是一个错误?

在C#中我看到了

-1 * int.MinValue == int.MinValue 

这是一个错误? 当我试图实现一个search树时,它真的把我搞砸了。 我结束了使用(int.MinValue + 1)以便我可以正确否定它。

这不是一个错误。

int.MinValue * -11大于int.MaxValue可以容纳。 因此,数字回到int.MinValue

这基本上是由整数溢出引起的。

Int32.MinValue

这个常数的值是-2,147,483,648

Int32.MaxValue

这个常数的值是2,147,483,647

因此, -2,147,483,648 * -1 = 2,147,483,648Int32.MaxValue 1

这不是一个错误,这是一个溢出。

在二的补码表示中,可表示数字的空间是不对称的。 最小整数的反面不能被表示。 计算它溢出,并再次给你相同的数字。

 int i = -1 * int.MinValue; 

这甚至不编译,除非你禁用检查:

 error CS0220: The operation overflows at compile time in checked mode 

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

例如,让我们取一个有符号的字节值在-128127之间。

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

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

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

把一个检查区域,并看到“错误”演变成一个例外。 或者尝试VB.NET(据我所知,这是默认检查不像C#)。