Java Integer Min_Value отрицательный, затем сравните - программирование
Подтвердить что ты не робот

Java Integer Min_Value отрицательный, затем сравните

Завтра у меня есть тест, и я не могу понять объяснение моих книг, я ценю помощь:

public class TestClass{
      public static void main(String[] args) throws Exception{
            int a = Integer.MIN_VALUE;
            int b = -a;
            System.out.println( a+ "   "+b);
      }
}

Выход: -2147483648 -2147483648

Почему это печатает 2 отрицательных числа с одинаковой величиной, а не положительные и отрицательные?

4b9b3361

Ответ 1

Из-за бесшумного переполнения целого числа: Integer.MIN_VALUE is -2^31 и Integer.MAX_VALUE is 2^31-1, поэтому -Integer.MIN_VALUE - 2^31, который Integer.MAX_VALUE + 1, который по определению слишком велик для целого числа. Поэтому он переполняется и становится Integer.MIN_VALUE...

Вы также можете проверить, что:

System.out.println(Integer.MAX_VALUE + 1);

печатает то же самое.

Более технически результат определяется Спецификацией Java Language # 15.18.2:

Если целочисленное добавление переполняется, то результатом являются младшие биты математической суммы, представленные в некотором достаточно большом формате с двумя дополнениями. Если происходит переполнение, знак результата не совпадает с знаком математической суммы двух значений операнда.

Ответ 2

В принципе, поскольку Integer.MAX_VALUE на самом деле только 2147483647, поэтому -Integer.MIN_VALUE, который будет +2147483648, фактически переполняет емкость внутреннего двоичного представления целых чисел. Таким образом, результат "циклически" возвращается к Integer.MIN_VALUE или -2147483648.

Если вы сделали long b = -((long)a); вместо этого, вы получите ожидаемый результат.

Ответ 3

Чтобы показать это еще более ясно:

<br>
 Integer.MIN_VALUE is -2^31 = -2147483648<br>
 Integer.MAX_VALUE is 2^31-1 = 2147483647 
 /*notice this is 1 less than the negative value above*/
 <br>

1Integer.MAX_VALUE не может принимать 2147483648. Это слишком большое число для Integer, равное 1. Это приводит к тому, что число возвращается на шкале от максимального значения до начального значения, которое является минимальным значением.