2016-08-21 8 views
0

Заметил ошибку в одной из программ, над которой я работал, извлек код, и это в основном это.
Это беззнаковое сравнение с подписанным междунар и приводит к бесконечному циклу:ошибка сравнения C++ unsigned without loop loop

#include <iostream> 

int main() 
{ 
    unsigned int i = 0; 
    while (i < 1000000) 
    { 
     printf("%o\n", i); 
     ++i; 
    } 
    return 0; 
} 

Я попытался использовать это вместо того, чтобы:

#include <iostream> 

int main() 
{ 
    unsigned int i = 0; 
    while (i < 1000000u) 
    { 
     printf("%o\n", i); 
     ++i; 
    } 
    return 0; 
} 

Что я думал, исправить подписанную/без знака сравнения, и он этого не делает, он все еще сталкивается с бесконечным циклом. Поэтому я также попробовал перевести его в unsigned int и без костей, все еще бесконечных циклов.

Использование Visual Studio 2015, полная оптимизация, выпуск компилятора.

+6

Вы уверены, что это бесконечный цикл? Это выглядит очень длинным циклом для меня, тем более, что печать занимает значительное время. Измените значение 'i + = 1000', чтобы увидеть, работает ли условие выхода. – dasblinkenlight

+0

Это не проблема сравнения с подписью/без знака. Значение '1000000' находится в обоих диапазонах, и вы попытались решить проблему, предположив, что это причина этого, но это не сработало. – AhmadWabbi

+1

Почему вы '#include ', но затем используйте 'printf'? – dxiv

ответ

3

В то время как я не могу воспроизвести бесконечную петлю на Win7, ни Ubuntu (как 64-разрядная версия) Я считаю, что проблема ваша Е() функция беззнаковое восьмеричное представление чисел, заставляет вас думать, что он входит в бесконечный цикл. Изменение параметра %o на %u может прояснить проблему.

+0

Да, это правда, std :: cout << std: : oct << n << '\ n' также изменяет базовое целое число на восьмеричное, что и было изначально –

1

Это происходит из-за переполнения типа int. См. Тип limits. Для такого огромного сравнения чисел следует использовать long вместо int

+0

Может быть, но 'int' составляет не менее 32 бит на большинстве платформ в эти дни. – Blorgbeard

+1

Вряд ли это так. OP упомянул VS 2015, где тип int по умолчанию 32-бит, гораздо шире, чем '1000000'. – dxiv

+0

и его 64-бит, скомпилированный на VC++, он печатает цифры, он просто не останавливается, пока он не достиг предела; а затем из-за неподписанных правил он все равно не останавливается, он только начинается с –