2014-01-13 3 views
2

У меня есть следующий кодПочему увеличивающиеся INT примитив в то время как цикл не зациклится

int i = 1; 

while(i != 0) { 
    i++; 
} 

Я ожидал этого, чтобы работать в бесконечном цикле, но это не так. Затем, когда я напечатал значение после цикла, я получил:

i value is 0. 

Может ли кто-нибудь сообщить мне, что именно происходит?

+2

Что еще более важно, почему вы думаете, что это должно * привести к проблемам с памятью? Где здесь используется память? –

+5

'Может ли кто-нибудь дать мне знать, что именно происходит?' - Целочисленное переполнение. – devnull

+1

+1, я не вижу ничего плохого в этом вопросе. – Maroun

ответ

17

Я ожидал, что это будет работать в бесконечном цикле, но это не так.

Нет, это не так. В итоге значение снова станет 0.

В частности, это будет логично выполнить так:

1 
2 
3 
... 
2,147,483,646 
2,147,483,647 
-2,147,483,648 // Integer overflow => wrapping 
-2,147,483,647 
... 
-3 
-2 
-1 
0 

... то цикл завершится

От section 15.18.2 of the JLS:

если целое сложение с переполнением, то результатом являются младшие биты математической суммы, представленные в некотором достаточно большом формате с двумя дополнениями. Если происходит переполнение, знак результата не совпадает с знаком математической суммы двух значений операнда.

Там нет памяти проблемы с этим кодом, потому что он не выполняет никаких распределений - это только увеличивает локальную переменную, целиком в стеке.

Теперь ли оно или нет на самом деле делает это совсем другое дело - если JIT может работать, что поведение будет без выполнения каждой итерации, он может оптимизировать его прочь - но это деталь реализации. Важной частью является понимание логики поведения.

+0

Большое спасибо. Да, это было так глупо, что я ожидал исключения памяти кучи вместо стека над ошибкой потока. Но теперь я понял, почему он не работает в бесконечном цикле и почему ошибок нет. –

+0

@SrikanthGanji: Почему вы даже ожидаете переполнения стека? В цикле больше не выделяется память стека - она ​​просто заменяет одно значение другим. –

4

An int является int: Для каждого i, если i является int так i+1. int всегда 32-бит, он никогда не требует большего контейнера.

Последнее, что ваша петля не бесконечна.