Тип целочисленных литералов по умолчанию не int?

Я только что ответил на этот вопрос , в котором спрашивалось, почему итерация до 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 ++, если они есть.

32
задан Community 23 May 2017 в 11:53
поделиться