Отзыв об анализе примера кода (безопасное кодирование)

У меня есть фрагмент кода из задания, в котором я не уверен. Я уверен, что знаю ответ, но я просто хочу перепроверить с сообществом, если что-то я забыл. Название в основном представляет собой безопасное кодирование, и вопрос заключается только в том, чтобы объяснить результаты.

int main() {
   unsigned int i = 1;
   unsigned int c = 1;
   while (i > 0) {
     i = i*2;
     c++;
   }
   printf("%d\n", c);
   return 0;
}

Я рассуждаю так:

На первый взгляд вы могли представить, что код будет работать вечно, учитывая, что он инициализирован положительным значением и постоянно увеличивается. Это, конечно, неправильно, потому что со временем значение вырастет настолько, что вызовет целочисленное переполнение. Это, в свою очередь, тоже не совсем верно, потому что в конечном итоге это заставит переменную 'i' должно быть подписано, сделав последний бит равным 1 и, следовательно, рассматриваться как отрицательное число, поэтому цикл завершается. Таким образом, он не записывает в нераспределенную память и, следовательно, вызывает целочисленное переполнение, а скорее нарушает тип данных и, следовательно, вызывает завершение цикла.

Я совершенно уверен, что это причина, но я просто хочу дважды проверить. Есть какие-нибудь мнения?

5
задан The Unfun Cat 2 October 2012 в 20:11
поделиться