Lorsque des types entiers comme char
, short int
, bool
prennent moins de nombre d'octets que int
, ces types de données sont automatiquement promus à int
ou unsigned int
lorsqu'une opération est effectuée sur eux.
C11 §6.3.1.1 booléens, les caractères et les entiers
Si un int peut représenter toutes les valeurs du type d'origine (comme limitée par la largeur , pour un champ binaire), la la valeur est convertie en int; sinon, il est converti en un entier non signé. Ceux-ci sont appelés les promotions entières . 58)
Ainsi, c+a
sont converties au type int
et le résultat a ce type commun d'opérandes qui est int
.
En outre, le comportement de votre code est undefined, car vous avez utilisé le mauvais spécificateur de format.
, utilisez %zu
au lieu de %d
parce sizeof()
retours size_t
et size_t
est unsigned
.
C11 Standard: §7.21.6.1: Paragraphe 9:
Si une spécification de conversion est invalide, le comportement est non défini. 225) Si un argument n'est pas le bon type pour la spécification de conversion correspondante , le comportement n'est pas défini.
À côté: '% d' ==>'% zu' –
comment diable est-ce que cela a eu autant de votes? –
Ouais ... C'est curieux ... Étant donné que l'expression 'sizeof (c + a)' est un non-sens et inutile par lui-même. Eh bien, je suppose que certaines personnes sont juste surprises par les résultats comme le PO est. –