Maison >développement back-end >C++ >Le dépassement d'entier signé est-il toujours un comportement indéfini en C ?
Le dépassement d'entier signé est-il toujours un comportement indéfini en C ?
Tel que défini dans la norme C 11, le dépassement d'entier signé reste un comportement indéfini. Bien que la documentation cstdint indique que les types int8_t, int16_t, int32_t et int64_t utilisent le complément à 2 pour les valeurs négatives, le comportement de débordement est toujours considéré comme indéfini.
La norme C 11 au paragraphe 5/4 indique catégoriquement :
**Si lors de l'évaluation d'une expression, le résultat n'est pas mathématiquement défini ou n'est pas dans la plage de
valeurs représentables pour son type, le comportement n'est pas défini.**
Par conséquent, même si une représentation en complément à deux est utilisée pour ces types signés, l'arithmétique modulo 2^n n'est pas implicitement supposée lors de l'évaluation.
À l'inverse, la norme C 11 précise explicitement au paragraphe 3.9.1/4 que l'arithmétique non signée adhère au module arithmétique :
Les entiers non signés, déclarés non signés, doivent obéir aux lois de l'arithmétique modulo 2^n où n est le nombre
de bits dans la représentation en valeur de cette taille particulière d'entier
Par conséquent, les opérations arithmétiques non signées sont toujours définissables mathématiquement, et la valeur résultante se situe dans la plage représentable, l'exemptant ainsi de la clause de comportement non définie. La note de bas de page 46 clarifie davantage ceci :
Cela implique que l'arithmétique non signée ne déborde pas car un résultat qui ne peut pas être représenté par le
type entier non signé résultant est réduit modulo le nombre qui est un. supérieur à la plus grande valeur pouvant être représentée par l'
entier non signé résultant type.
En résumé, bien que l'utilisation de la représentation du complément à 2 pour les types signés fournisse un comportement bien défini pour les valeurs négatives, le débordement d'entier pour ces types reste un comportement indéfini en C, car la norme remplace tout comportement dépendant de l'implémentation. .
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!