Когда вы добавляете 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
s и , а затем неявно преобразует в long
. Вам нужно сделать:
long l = (long) Integer.MAX_VALUE + 1
System.out.println(l); // now prints the correct value