Type de littéraux entiers : pas Int par défaut ?
Question :
Pourquoi une boucle for itérant jusqu'à 10 milliards prend plus de temps qu'une itération jusqu'à 1 milliards ?
Réponse :
La variable d'itération dans la boucle est de 32 bits et déborde, provoquant une boucle infinie. Le littéral représentant 10 milliards, bien qu'il n'ait pas de suffixe L, est automatiquement promu dans une plage appropriée (au moins 64 bits dans ce cas) par le compilateur.
C :
Selon la norme C 11 ([lex.icon] ¶2), le type d'un littéral entier sans suffixe est le premier du tableau 6 où sa valeur peut être représentée :
Type |
---|
int |
long int |
long long int |
Par conséquent, dans ce cas, le littéral est interprété comme un long int ou long long int (si long int est de 32 bits).
C :
En C99 ([§6.4.4.1]), la règle est similaire. Le type d'une constante entière est déterminé par le premier type d'une liste similaire où sa valeur peut être représentée.
Types définis par l'implémentation :
Les deux C 11 ( [lex.icon] ¶3) et C99 ([§6.4.4.1 ¶5]) permettent aux littéraux entiers d'être de "types entiers étendus" (types entiers spécifiques à l'implémentation) si aucun autre type valide n'est trouvé.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!