Как unsigned int ведет себя с циклом while?

У меня есть этот небольшой фрагмент кода, и мне трудно понять, что может быть результатом?

int main()
{
    unsigned int i=65000;
    while ( i++ != 0 );
    printf("%d",i);
    return 0;
}

Я чувствую, что постинкремент играет важную роль в цикле, но я не могу это представить. По-разному ли ведут себя беззнаковые целые числа в циклах while после достижения максимального положительного значения? Наконец, какова цель точки с запятой после цикла while?


person f__society    schedule 29.04.2017    source источник
comment
Целочисленное переполнение без знака определено в C и, по сути, зацикливается.   -  person    schedule 29.04.2017
comment
Скомпилировать и запустить?   -  person Daniel Jour    schedule 29.04.2017
comment
Цикл завершится, как только i достигнет своего максимального значения (оборачивается на 0), хотя весьма вероятно (конечно, при включенной оптимизации компилятора) цикл будет отброшен, а i будет напрямую установлено в 1 (вам нужно будет проверить вывод ассемблера для этого).   -  person    schedule 29.04.2017
comment
Запущенный в онлайн-среде IDE, он говорит: «Превышение лимита времени в 5 секунд» указывает ли это на бесконечный цикл @DanielJour?   -  person f__society    schedule 29.04.2017
comment
Это просто указывает на цикл длиннее 5 секунд. Почему 5 секунд бесконечны?   -  person    schedule 29.04.2017
comment
Это не зависит от цикла while, без знака означает, что самый левый бит, который содержит значение i, не установлен в 1. Самый левый бит известен как бит со знаком.   -  person Inder R Singh    schedule 29.04.2017
comment
Узнайте больше о подписанном бите в Linux, который будет вашим ответом   -  person Inder R Singh    schedule 29.04.2017
comment
Беззнаковые типы @InderRSingh не имеют битов знака   -  person harold    schedule 29.04.2017
comment
@harlod, пожалуйста, внимательно прочитайте мои 2 комментария   -  person Inder R Singh    schedule 29.04.2017
comment
@InderRSingh, вы неправильно понимаете мое имя, хотя оно заполняется автоматически, и в любом случае я думал, что прочитал их четко - возможно, ваши комментарии неясны. Знакового бита нет, так что это не имеет отношения к тому, что здесь происходит. Конечно, старший бит unsigned int может равняться 1.   -  person harold    schedule 29.04.2017
comment
Вызов функции, принимающей переменное количество аргументов (printf()) без прототипа в области видимости, вызывает неопределенное поведение (может случиться что угодно: программа может зависнуть, программа может напечатать 42, компилятор может остановиться, не создав исполняемый файл, ...). Вам нужно #include <stdio.h> для соответствующей программы.   -  person pmg    schedule 29.04.2017
comment
@InderRSingh: Ваши комментарии не имеют смысла. Как писал Гарольд, целые числа без знака не имеют знакового бита. Вы можете спутать их с целыми числами с положительным знаком, у которых есть бит знака, но это не обязательно самый старший бит в единице хранения. Кроме того, переполнение целого числа со знаком является одним из классических способов вызова неопределенного поведения. И это не имеет абсолютно ничего общего с ОС Linux.   -  person too honest for this site    schedule 29.04.2017


Ответы (1)


Определено переполнение целочисленного числа без знака (см. определено поведение переполнения целого числа без знака, а переполнение целого числа со знаком — нет?), и этот код, вероятно, завершится (это может занять некоторое время: см. ниже).

Однако размер int зависит от платформы. Если он был 16-битным (некоторые старые компиляторы), он скоро достигнет максимального значения 65535 и завершится на переносе. Однако, если он был 32-битным (GCC и многие другие), его переполнение займет некоторое время. Его также можно оптимизировать, так как он не имеет побочных эффектов: см. ниже.

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

Наконец, вывод будет 1.

person Tatsuyuki Ishi    schedule 29.04.2017
comment
Я думаю, что результат равен 1 (попробуйте), так как есть приращение постфикса к i. - person ; 29.04.2017
comment
Поправил вещи. - person Tatsuyuki Ishi; 29.04.2017
comment
geeksforgeeks.org/output-of-c-programs-set-6 См. здесь, они говорят, что вывод будет 1. Пытался запустить в их IDE, но он говорит: «Превышено ограничение времени в 5 секунд» - person f__society; 29.04.2017
comment
Конечно, если вы разрешаете запускать программы для публики, вы должны установить ограничение по времени для этих программ. Вы не хотите, чтобы люди могли сломать вашу систему. Следовательно, программа не завершена, так как истекло время - person Ed Heal; 29.04.2017
comment
@f__society для запуска вашей программы на моем ПК требуется около 7 секунд с использованием 32-разрядной версии int. - person Weather Vane; 29.04.2017