问题
This question already has an answer here:
- Math.abs returns wrong value for Integer.Min_VALUE 7 answers
Consider the below java code.
Integer value = Integer.MIN_VALUE;
System.out.println(value);
value = -value;
System.out.println(value);
Output
-2147483648
-2147483648
How the negative value of Integer.MIN_VALUE
value results the same value?
However the result can't be 2147483648
because the maximum value of Integer in java is 2147483647
.
But want to know why -2147483648
? What kind of bit-wise operations are happening internally?
回答1:
What kind of bit-wise operations are happening internally?
Java uses two's complement representation of signed numbers. Therefore, the change of sign operation, consists of two steps:
- Inverting the bits of the original value, and
- Adding
1
to the result.
2147483648
's representation is shown below:
10000000000000000000000000000000
Inverting it produces
01111111111111111111111111111111
Adding 1
makes it the same number again, i.e.
10000000000000000000000000000000
due to integer overflow.
回答2:
When you negate -2147483648
, it resolves to 2147483648
, which exceeds the Integer.MAX_VALUE
with 1
. Then the value overflows to Integer.MIN_VALUE
again.
From the JLS:
The integral types are byte, short, int, and long, whose values are 8-bit, 16-bit, 32-bit and 64-bit signed two's-complement integers.
So, every unary operation done on an integer will actually be applied on the two's complement representation of the number.
When the Integer.MAX_VALUE
is reached it will consist of a leading 0
and 31 1
bits. Adding 1
would make it a number with a leading 1
and 31 trailing 0
s, which is actually the two's complement representation of Integer.MIN_VALUE
.
来源:https://stackoverflow.com/questions/31540421/why-does-the-negative-of-integer-min-value-give-the-same-value