Я заметил некоторое неожиданное поведение (неожиданное относительно моих личных ожиданий), и мне интересно, есть ли какая-то ошибка в JVM или, возможно, это побочный случай, когда я не понимаю некоторых деталей того, что именно должно произойти. Предположим, у нас есть следующий код в методе main сам по себе:
int i;
int count = 0;
for(i=0; i < Integer.MAX_VALUE; i+=2){
count++;
}
System.out.println(i++);
Наивным ожиданием было бы, что это выведет Integer.MAX_VALUE-1
, самое большое даже представимое int
. Однако я полагаю, что целочисленная арифметика в Java должна "переворачиваться", поэтому добавление 1 к Integer.MAX_VALUE
должно привести к Integer.MIN_VALUE
. Поскольку Integer.MIN_VALUE
все еще меньше, чем Integer.MAX_VALUE
, цикл продолжит итерацию по четным отрицательным значениям int. В конце концов он вернется к 0, и этот процесс должен повториться как бесконечный цикл.
Когда я действительно запускаю этот код, я получаю недетерминированные результаты. Результат, который выводится на печать, имеет тенденцию быть порядка полумиллиона, но точное значение варьируется. Таким образом, цикл не только завершается, когда, по моему мнению, он должен быть бесконечным, но и, похоже, завершается случайным образом. Что происходит?
Я предполагаю, что это либо ошибка в JVM, либо происходит много забавных оптимизаций, которые делают такое поведение ожидаемым. Что именно?