Вопрос
Почему этот код возвращает неправильное значение?
int i=Integer.MAX_VALUE+1;
long l=Integer.MAX_VALUE+1;
System.out.println(l);
System.out.println(i);
Решение
Когда вы добавляете 1 в Integer.MAX_VALUE
он переполняется и оборачивается, чтобы Integer.MIN_VALUE
.
Это происходит, потому что Java использует Два дополнения представлять целые числа. Пример в 4 битах:
0000 : 0
0001 : 1
...
0111 : 7 (max value)
1000 : -8 (min value)
...
1110 : -2
1111 : -1
Итак, когда вы добавляете 1 в 0111
(Макс) Это идет 1000
, и это минимум. Разверните эту идею до 32-битных, и она работает так же.
Что касается того, почему ваш long
также показывает неверный результат, это потому, что он выполняет дополнение к int
песок потом неявно преобразуя в long
. Анкет Вам нужно сделать:
long l = (long) Integer.MAX_VALUE + 1
System.out.println(l); // now prints the correct value
Другие советы
Как говорит название Integer.MAX_VALUE
максимальное значение доступно для Integer
. Анкет В Java, когда целое число переходит на его максимальное значение на 1 (или переполнено на 1), то его значение будет Integer.MIN_VALUE
.
Если целочисленное добавление переполняется, то результатом являются биты низкого порядка математической суммы, представленные в некотором достаточно большем формате двух компенсации. Если происходит переполнение, то знак результата не совпадает с знаком математической суммы двух значений операнда.
Остерегайтесь, с Float или Double у вас не будет переполнения, значение будет POSITIVE_INFINITY
Операция, которая переполнена, создает подписанную бесконечность, операция, которая поднимится, дает денормализованное значение или подписанное ноль, а операция, которая не имеет математически определенного результата, дает NAN.
Ресурсы :
Вы перегружете 32-битный целочисленный тип здесь, пытаясь хранить значение, которое не может быть представлено этим типом (2 ^ 31 - 1):
int i = Integer.MAX_VALUE + 1;
Java integer составляет 32-битный подписанный тип диапазон от: -2,147,483,648 до 2147,483 647.
Вы не можете установить i
целочисленная переменная, как и в i=Integer.MAX_VALUE+1;