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 отрицательных числа с одинаковой величиной, а не положительные и отрицательные?
Ответы
Ответ 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. Это приводит к тому, что число возвращается на шкале от максимального значения до начального значения, которое является минимальным значением.