Débordement d'entier - Pourquoi ne pas [dupliquer]
-
14-11-2019 - |
Question
Double Possible:
Plus de deux caractères produit int
Étant donné que le code C++ suivant:
unsigned char a = 200;
unsigned char b = 100;
unsigned char c = (a + b) / 2;
La sortie est de 150 logiquement attendu, cependant, ne devrait-il pas être un débordement d'entier dans l'expression (a + b)
?
Évidemment, il doit être un entier de promotion de traiter avec le débordement de là, ou quelque chose d'autre se passe que je ne vois pas.Je me demandais si quelqu'un pouvait m'éclairer, afin que je puisse savoir ce que c'est que je peux et ne doit pas reposer sur en termes de nombre entier de promotion et de débordement.
La solution
Ni C++ C pas effectuer des calculs arithmétiques dans les "petites" les types integer, comme, char
et short
.Ces types sont presque toujours promu int
avant de poursuivre les calculs de commencer.Donc, votre expression est vraiment évalué comme
unsigned char c = ((int) a + (int) b) / 2;
P. S.Sur certains exotiques plate-forme où la gamme de int
ne couvrent pas l'ensemble des unsigned char
, le type unsigned int
sera utilisé comme type de cible pour la promotion.
Autres conseils
Non, ce n'est pas une erreur.
Le compilateur calcule toujours au minimum de l'entier de précision, le résultat sera de nouveau converti en unsigned char sur l'attribution uniquement.
C'est dans la norme.
Pour les autres réponses, ce n'est pas une erreur sur x86 et d'autres (sane) 32 bits et 16 bits architectures.
Cependant, sur de plus petits ou moins sain d'esprit architectures (généralement très petits microcontrôleurs) des choses comme ce sera probablement commencer à causer des problèmes, surtout si quiconque en œuvre de votre compilateur n'a pas de test/validation du budget de certaines des plus grandes entreprises là-bas (encore une fois, microcontrôleurs).