Comportement de débordement pour les entiers signés en C
En C, le débordement d'entier signé, comme en C, est un comportement indéfini. Cela signifie que le résultat d'une expression qui déborde n'est pas spécifié par la norme et que le compilateur est libre de le gérer d'une manière définie par l'implémentation. Cependant, C 11 a introduit le concept de types « entiers à largeur fixe », tels que int8_t, int16_t, int32_t et int64_t.
Types entiers à largeur fixe
Ces types garantissent que les nombres négatifs sont représentés en utilisant la représentation en complément à 2. Cela suggère que les opérations arithmétiques sur ces types pourraient se comporter comme modulo 2 ^ n, où n est la largeur de l'entier. Cependant, ce n'est pas le cas.
Comportement de débordement pour les types à largeur fixe
Même pour les types à largeur fixe, le débordement d'entier signé reste un comportement indéfini. La norme C 11 (paragraphe 5/4) indique explicitement que si une expression aboutit à une valeur mathématiquement indéfinie ou non représentable, le comportement est indéfini.
Débordement d'entier non signé
Contrairement au débordement d'entier signé, le débordement d'entier non signé est explicitement défini pour les types de largeur fixe. Selon le paragraphe 3.9.1/4 de la norme C 11, l'arithmétique non signée obéit aux lois de l'arithmétique modulo 2^n. La note de bas de page 46 précise que les opérations sur les entiers non signés ne débordent pas car le résultat est réduit modulo la valeur maximale représentable.
Conclusion
Malgré l'utilisation de la représentation du complément à 2 pour les types à largeur fixe, le dépassement d'entier signé reste un comportement indéfini. D'un autre côté, le débordement d'entier non signé est bien défini et suit l'arithmétique modulo. Cette différence met en évidence la distinction fondamentale entre les types entiers signés et non signés en C .
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!