Selon le C standard (6.5.9 opérateurs) l'égalité
4 Si les deux opérandes sont de type arithmétique, l'arithmétique conversions habituelles sont effectuées ....
Les conversions arithmétiques habituelles incluent les promotions d'entier.
De la norme C (6.3.1.1 booléens, les caractères et des nombres entiers)
2 Les suivants peuvent être utilisés dans une expression où on peut utiliser une ou int unsigned int: ...
Si un int peut représenter toutes les valeurs de le type d'origine (limité par la largeur, pour un champ de bits), la valeur est convertie en int; sinon, il est converti en un entier non signé. On les appelle les promotions entières 0,58) Tous les autres types ne sont pas modifiées par l'entier promotions.
Ainsi, dans cette expression de l'égalité
a == b
les deux opérandes sont convertis en type int
. L'opérande signé (à condition que le type char
se comporte comme le type signed char
) est converti en le type int
au moyen de propager le bit de signe.
Comme résultat opérandes ont des valeurs différentes en raison de la différence dans la représentation binaire.
Si le type char
se comporte comme le type unsigned char
(par exemple en définissant une option correspondante du compilateur) alors évidemment les opérandes seront égaux.
lire un bon livre C et en apprendre davantage sur la représentation de la mémoire des différents types de données et de la différence entre '' signed' et les types de données unsigned' – krpra
« * différent * » vraiment? – alk
"quelle est la valeur pour a et b" aurait pu être étudié facilement avec 'printf ("a =% d, b =% d", a, b);' – chux