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