views:

449

answers:

5

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.

+41  A: 

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.

jjnguy
integer math is sooo coool! ;)
Mark Schultheiss
@Mark, in this case, I think it is not cool. It is confusing.
jjnguy
+9  A: 

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.

Pascal Cuoq
for less than a second, I thought you would say It's not a bug, it's an feature. :D
Jonathan
+7  A: 
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
Darin Dimitrov
+2  A: 

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)

Torlack