У меня есть фрагмент кода из задания, в котором я не уверен. Я уверен, что знаю ответ, но я просто хочу перепроверить с сообществом, если что-то я забыл. Название в основном представляет собой безопасное кодирование, и вопрос заключается только в том, чтобы объяснить результаты.
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 и, следовательно, рассматриваться как отрицательное число, поэтому цикл завершается. Таким образом, он не записывает в нераспределенную память и, следовательно, вызывает целочисленное переполнение, а скорее нарушает тип данных и, следовательно, вызывает завершение цикла.
Я совершенно уверен, что это причина, но я просто хочу дважды проверить. Есть какие-нибудь мнения?