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