-1 * int.MinValue == int.MinValue?? Is this a bug?

北慕城南 提交于 2019-12-03 06:28:34

问题


In C# I see that

-1 * int.MinValue == int.MinValue

Is this a bug? It really screwed me up when I was trying to implement a search tree. I ended up using (int.MinValue + 1) so that I could properly negate it.


回答1:


This is not a bug.

int.MinValue * -1 is 1 greater than int.MaxValue can hold. Thus, the number wraps around back to int.MinValue.

This is basically caused by an integer overflow.

Int32.MinValue:

The value of this constant is -2,147,483,648

Int32.MaxValue:

The value of this constant is 2,147,483,647

So, -2,147,483,648 * -1 = 2,147,483,648 which is 1 greater than Int32.MaxValue.




回答2:


It's not a bug, it's an overflow.

In two's complement representation, the space of representable numbers is not symmetric. The opposite of the smallest integer cannot be represented. Computing it overflows and gives you the same number again.




回答3:


int i = -1 * int.MinValue;

This doesn't even compile unless you disable checking:

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



回答4:


No, it isn't a bug. It is the nature of twos complement integer arithmetic.

For example, let us take a signed byte value which goes between -128 and 127.

127(0x7f)+1 = 128(0x80). However, 0x80 is in fact the binary representation of -128.

Thus, for a byte, 128(0x80) = -128(0x80)

So -128(0x80) * -1 = 128(0x80) = -128(0x80)




回答5:


Put a checked region on it and see the "bug" evolve into an exception. Or try VB.NET (which as far as I recall is checked by default unlike C#).



来源:https://stackoverflow.com/questions/3622347/1-int-minvalue-int-minvalue-is-this-a-bug

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!