Tipo de literais inteiros não int por padrã

Acabei de responderessa questã, que perguntou por que a iteração até 10 bilhões em um loop for leva muito mais tempo (o OP realmente a interrompeu após 10 minutos) do que a iteração até 1 bilhão:

for (i = 0; i < 10000000000; i++)

gora, a resposta óbvia da minha e de muitas outras pessoas foi que a variável de iteração era de 32 bits (que nunca atinge 10 bilhões) e o loop obtinha um loop infinit

Mas, embora eu tenha percebido esse problema, ainda me pergunto o que realmente estava acontecendo dentro do compilado

Como o literal não foi anexado com umL, deve ser do tipo @ IMint também e, portanto, de 32 bits. Portanto, devido ao estouro, deve ser um @ normint dentro do intervalo para estar acessível. Para realmente reconhecer que não pode ser alcançado a partir deint, o compilador precisa saber que são 10 bilhões e, portanto, vê-lo como uma constante de mais de 32 bit

Esse literal é promovido para um intervalo adequado (ou pelo menos definido pela implementação) (pelo menos 64 bits, neste caso) automaticamente, mesmo que não seja anexado umL e esse comportamento é padrão? Ou algo diferente está acontecendo nos bastidores, como o UB devido ao estouro (o excesso de números inteiros é realmente UB)? Algumas citações da Norma podem ser boas, se houve

Embora a pergunta original fosse C, também aprecio respostas em C ++, se houver alguma diferenç

questionAnswers(3)

yourAnswerToTheQuestion