Comportement non défini du dépassement d'entier signé en C
Le dépassement d'entier signé, l'occurrence lorsque la valeur d'un entier signé dépasse sa plage représentable, est bien -connu pour être un comportement indéfini en C . Cependant, la documentation C 11 cstdint introduit une déclaration intrigante : les valeurs négatives dans les types int8_t, int16_t, int32_t et int64_t sont explicitement spécifiées comme étant représentées à l'aide du complément à 2.
Cette spécification soulève la question : l'utilisation de Le complément de 2 pour les valeurs négatives dans ces types modifie le statut de comportement indéfini de débordement ?
La réponse, malheureusement, reste oui. Selon la section 18.4.1 de la norme C 11, l'en-tête définit toutes les fonctions, types et macros de manière identique à la section 7.20 de la norme C. La section 7.20.1.1 de la norme C11 clarifie davantage la définition de intN_t en tant que types entiers signés avec représentation en complément à 2.
Malgré cette spécification de la représentation en complément à 2, la norme C 11 indique sans équivoque dans la section 5/4 que tout une expression qui aboutit à un résultat mathématique indéfini ou qui se situe en dehors de la plage représentable de son type entraînera un résultat indéfini comportement.
Ainsi, l'utilisation du complément à 2 pour les valeurs négatives n'implique pas que l'arithmétique pour ces types adhère au comportement modulo 2^n. Cependant, pour les entiers non signés, la norme spécifie explicitement que les lois de l'arithmétique modulo 2^n s'appliquent, rendant le comportement de débordement mathématiquement défini et dans la plage représentable. Par conséquent, un débordement non signé n'est pas considéré comme un comportement indéfini.
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!