Вопрос

Почему этот код возвращает неправильное значение?

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;

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top