почему этот код возвращает неправильное значение?
int i=Integer.MAX_VALUE+1;
long l=Integer.MAX_VALUE+1;
System.out.println(l);
System.out.println(i);
почему этот код возвращает неправильное значение?
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, когда Integer превышает свое максимальное значение на 1 (или переполняется на 1), его значение будет Integer.MIN_VALUE
.
Если целочисленное сложение переполняется, то результатом являются младшие биты математической суммы, представленные в некотором достаточно большом формате с дополнением до двух. Если происходит переполнение, то знак результата не совпадает со знаком математической суммы двух значений операнда.
Осторожно, с Float или Double у вас не будет этого переполнения, значение будет POSITIVE_INFINITY
Операция, которая переполняется, дает бесконечность со знаком, операция, которая теряет значение, дает денормализованное значение или ноль со знаком, а операция, которая не имеет математически определенного результата, дает NaN.
Ресурсы:
Здесь вы переполняете 32-битный целочисленный тип, пытаясь сохранить значение, которое не может быть представлено этим типом (2 ^ 31 - 1):
int i = Integer.MAX_VALUE + 1;
Целое число Java представляет собой 32-битный знаковый тип, диапазон значений: от -2 147 483 648 до 2 147 483 647.
Вы не можете установить i
целочисленную переменную, как в i=Integer.MAX_VALUE+1;