2017-01-26 3 views
1

Давайте предположим, что мы имеем следующий цикл:Будет ли петля Infinite никогда не закончится сам себя

for (int i = 1; i < 2; i--) 
    { 
     cout << i << endl; 
    } 

Без сомнения, это бесконечное для цикла. Однако, мой вопрос заключается в том, как долго он будет работать? Потому что мой профессор сказал, что если int is 4 bytes = 32 bits, он может хранить число от -2147483648 to 2147483647. Учитывая это, он продолжал говорить, что в циклическом режиме, если он когда-либо достигнет одного из этих чисел, и цикл все еще запрограммирован на продолжение (например, этот), то число станет положительным, и условие будет выполняться, завершая цикл.

Мой вопрос в том, как это происходит: как это происходит? Почему число -2147483648 становится +2147483648 в for-loop, и почему +2147483648 превращается в -2147483648 в for-loop? Потому что я думал, что ошибка сегментации произойдет, как только счетчик достигнет 2147483649. Спасибо за ваши ответы!

+3

«Без сомнения, это бесконечный цикл для цикла» ... без сомнения, этот цикл даже не будет выполняться один раз, потому что условие цикла «i> 2' никогда не будет истинным. –

+1

Бесконечный цикл будет 'while (true) {}'. Но похоже, что ваш вопрос действительно касается целочисленной арифметики, а не циклов. – MrEricSir

+0

@TimBiegeleisen Спасибо, что подтвердили это для меня. Думал, что я принимаю сумасшедшие таблетки. – mascoj

ответ

2

почему +2147483647 поворот -2147483648

Это становится очевидным, если вы напишете ваше число в битовом представлении. Для простоты позволяет взять 8-битную переменную, например char или std :: int8_t. 8-разрядный тип может содержать 2^8 = 256 различных значений. Для подписанной переменной это значения от -128 до 127 (значение 0 также является значением, поэтому только до 127). Несколько примеров:

0000 0000 = 0 
0000 0001 = 1 
0111 1111 = 127 

1111 1111 = -1 
1111 1110 = -2 
1000 0000 = -128 

Вы можете легко видеть, что значение -1 должно быть 1111 1111, если вы, например, вычислить -1 + 2 = 1

1111 1111 
+ 0000 0010 
    1111 11  (carry)  
    --------- 
    0000 0001 

Если увеличить значение 0111 1111 = 127 вы получаете 1000 0000 = -128. То точно, что произошло в вашем случае, просто с несколькими битками.

Однако, поскольку Фантастический мистер Фокс уже упоминал, действительно ли он обертывается, зависит от реализации компилятора и не определяется стандартом.

5

Чтобы ответить на ваш вопрос с вопросом; Will an Infinite Loop ever end by Itself:

No.

Но ваш цикл не только не бесконечна, она не будет работать даже когда-то из-за для условия цикла.

for (int i = 1; i > 2; i--) 

i, на 1 никогда не будет удовлетворять условию я> 2 цикла.

Позволяет сказать, что вы имели в виду i < 2, тогда ответ есть, я не знаю. Целочисленное переполнение - неопределенное поведение в C++ (see here).

Это будет в большинстве случаев обертываться, но поскольку поведение не определено, нет никакого смысла обсуждать, что действительно произойдет.

Смежные вопросы