Type des entiers littéraux pas int par défaut?

J'ai simplement répondu à cette question, qui lui a demandé pourquoi l'itération jusqu'à 10 milliards de dollars dans une boucle for prend beaucoup plus de temps (l'OP fait avortée au bout de 10 minutes) que l'itération jusqu'à 1 milliard de dollars:

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

Maintenant, ma et beaucoup d'autres " réponse évidente était que c'était dû à la variable d'itération en cours de 32 bits (ce qui n'a jamais atteint 10 milliards de dollars) et la boucle se boucle infinie.

Mais si j'ai compris ce problème, je me demande encore ce qui se passait réellement à l'intérieur du compilateur?

Depuis le littéral n'a pas été ajouté avec un L, il devrait à mon avis être de type int, trop, et donc de 32 bits. Donc à cause de débordement, il devrait être normale int à l'intérieur de la gamme, afin d'être joignable. Effectivement reconnaître qu'il ne peut pas être atteint à partir de int, le compilateur doit savoir qu'il est de 10 milliards de dollars et donc le voir comme un plus-que-32-bit constant.

Un littéral à obtenir une promotion à un côté (ou au moins la mise en œuvre définies) de la fourchette (au moins 64 bits, dans ce cas) automatiquement, même si pas ajouté une L et cette norme de comportement? Ou est quelque chose de différent se passe derrière les coulisses, comme UB due au débordement (integer overflow effectivement UB)? Quelques citations de la Norme peut être sympa, le cas échéant.

Bien que la question d'origine était le C, j'apprécie aussi C++ réponses, si différent.

  • Version courte: Oui, le compilateur automatiquement favorise les littéraux, si je ne suis pas sûr que c'est un "tout le monde le fait" ou un "c'est obligatoire." Aussi, oui, signée de dépassement d'entier est en fait UB. Je laisse à quelqu'un d'autre à creuser les normes des citations et des tas de la récompense.
  • Ce type de variable est "je"?
  • En raison de l'OP de la question et de sa solution, il est une variable de 32 bits et j'ai moi-même crois que c'était un int ou unsigned int (est-ce paramètre fait de l'importance ici?).
  • Chaque fois que vous utilisez "a mon avis", en référence à une règle du langage, c'est un signe que vous devriez vérifier le standard de première.
  • En effet, j'ai fait la première devrait avoir fouillé dans la norme au lieu d'aller à la manière paresseuse d'une SORTE de question. Vous pourriez à juste titre de me blâmer pour juste être paresseux.
  • Si le corps de la boucle est vide, je serais surpris si un compilateur optimisant ne s'est pas juste la chose entière, indépendamment de la boucle lié.
  • En effet, il a dit que c'était son vrai testé exemple et, évidemment, le compilateur n'a pas l'optimiser à l'écart.