Целочисленное поведение переполнения минимального/максимального значения

Почему 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

Ответ 2

scala> println(Integer.MAX_VALUE)
2147483647

scala> println(Integer.MIN_VALUE)
-2147483648

Итак, Integer.MIN_VALUE= - (Integer.MAX_VALUE + 1)

Итак, если MIN_VALUE + MIN_VALUE = 0, то MAX_VALUE + MAX_VALUE = 0 - 1 - 1 = -2

Ответ 3

В компьютерной системе значения выражаются в комплементарной кодировке кода Положительный - это дополнение к своему Дополнение равно абсолютному значению отрицательного значения исходного кода, который вы отрицаете, а целое число 1 для числа