Why does the negative of Integer.MIN_VALUE give the same value? [duplicate]

时光毁灭记忆、已成空白 提交于 2019-11-27 06:50:38

问题


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:

  1. Inverting the bits of the original value, and
  2. 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 0s, 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

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