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.

Était-ce utile?

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).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top