Целочисленное поведение переполнения минимального/максимального значения
Почему Integer.MIN_VALUE * 2 равно 0?
И Integer.MAX_VALUE * 2 равно -2?
Позвольте мне объяснить себя лучше:
Я знаю, что он переполняется, но почему он получает эти конкретные результаты?
Ответ 1
Integer.MIN_VALUE= -2147483648. Посмотрите на вычисление бит 2 * -2147483648
Integer.MIN_VALUE*2 = Integer.MIN_VALUE+Integer.MIN_VALUE
-2147483648= 10000000 00000000 00000000 00000000 ->32 bit
+10000000 00000000 00000000 00000000
_________________________________________________________________
2* -2147483648= 1 00000000 00000000 00000000 00000000 Result is 0
|
This bit will be omitted due to limitation of 32 bit
Integer.MAX_VALUE=2147483647, посмотрите на вычисление бит 2 * 2147483647
Integer.MAX_VALUE*2 = Integer.MAX_VALUE+Integer.MAX_VALUE
2147483647= 01111111 11111111 11111111 11111111 ->32 bit
+01111111 11111111 11111111 11111111
_________________________________________________________________
2* 2147483647= 11111111 11111111 11111111 11111110 Result is -2
Итак, если MIN_VALUE + MIN_VALUE = 0, то MAX_VALUE + MAX_VALUE = 0 - 1 - 1 = -2
Ответ 3
В компьютерной системе значения выражаются в комплементарной кодировке кода
Положительный - это дополнение к своему
Дополнение равно абсолютному значению отрицательного значения исходного кода, который вы отрицаете, а целое число 1 для числа