Это ошибка JVM или "ожидаемое поведение"?

Я заметил некоторое неожиданное поведение (неожиданное относительно моих личных ожиданий), и мне интересно, есть ли какая-то ошибка в 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, либо происходит много забавных оптимизаций, которые делают такое поведение ожидаемым. Что именно?

70
задан Michael McGowan 3 March 2011 в 16:21
поделиться