Я только что ответил на этот вопрос , в котором спрашивалось, почему итерация до 10 миллиардов в цикле for занимает гораздо больше времени (OP фактически прервал его после 10 минут), чем повторение до 1 миллиарда:
for (i = 0; i < 10000000000; i++)
Теперь мой и многие другие очевидный ответ заключался в том, что это произошло из-за того, что переменная итерации была 32-битной (которая никогда не достигает 10 миллиардов), а цикл превращается в бесконечный цикл.
Но хотя я осознал эту проблему, мне все еще интересно, что на самом деле происходит внутри компилятора?
Поскольку литерал не был добавлен с помощью L
, он должен иметь тип int
тоже, и, следовательно, 32-битный. Таким образом, из-за переполнения он должен быть нормальным int
внутри диапазона, чтобы быть достижимым. Помните, что его нельзя получить из int
, компилятор должен знать, что это 10 миллиардов, и поэтому рассматривать его как более чем 32-битную константу.
Повышается ли такой литерал до подходящего (или, по крайней мере, определяемого реализацией) диапазона (в данном случае не менее 64-битного), даже если он не добавлен L
, и является ли этот стандарт поведение? Или что-то другое происходит за кулисами, например UB из-за переполнения (действительно ли целочисленное переполнение UB)? Некоторые цитаты из Стандарта могут быть хорошими, если таковые имеются.
Хотя исходный вопрос был на C, я также ценю ответы C ++, если они есть.