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.
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.
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.
The value of this constant is
-2,147,483,648
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
.
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.
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
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)