Dépassement d'entier signé en C : comportement toujours non défini
Comme souligné dans la documentation C 11 cstdint, les types d'entiers signés tels que int8_t, int16_t , int32_t et int64_t utilisent le complément à 2 pour les valeurs négatives valeurs. Cela a soulevé la question : cela implique-t-il que le débordement dans ces types n'est plus considéré comme un comportement indéfini ?
Non, le débordement de ces types reste un comportement indéfini en C .
Selon le paragraphe 5/4 de la norme C 11, toute expression dont le résultat n'est pas mathématiquement défini ou se situe en dehors de la plage représentable du type entraîne un résultat indéfini. comportement.
Bien que int8_t, int16_t, int32_t et int64_t utilisent le complément à 2, cela n'implique pas que l'arithmétique modulo 2^n est appliquée. La norme déclare explicitement que :
"Le résultat d'une opération arithmétique non signée est toujours 'mathématiquement défini', et le résultat est toujours dans la plage représentable ; par conséquent, 5/4 ne s'applique pas."
Par conséquent, l'arithmétique non signée suit les lois de l'arithmétique modulo 2^n, et le débordement n'est pas un comportement indéfini. Cependant, pour l'arithmétique signée, le débordement reste un comportement indéfini, quelle que soit la représentation sous-jacente.
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!