Parce que l' int
de la valeur est promue à un unsigned int
. plus précisément 0xFFFFFFFC
sur une machine 32 bits, qui est l' unsigned int
est 4294967292
, nettement plus grand que 10
C99 6.3.1.1-p2
Si un int peut représenter toutes les valeurs du type d'original (que limitée par la largeur, pour un peu de champ), la valeur est convertie en un entier (int); sinon, il est converti en unsigned int. Ceux-ci sont appelés l'entier des promotions. Tous les autres types sont inchangées par l'entier des promotions.
Pour effectuer la conversion:
C99 6.3.1.3-p2
Sinon, si le nouveau type est non signé, la valeur est convertie à plusieurs reprises en ajoutant ou en soustrayant un de plus que la valeur maximale qui peut être représenté dans le nouveau type jusqu'à ce que la valeur est dans la gamme de la nouvelle type.
Ce qui signifie fondamentalement "ajouter UINT_MAX+1" (comme je l'ai lu, de toute façon).
Concernant les raisons de la promotion a été à l' unsigned int
côté; l'ordre de préséance:
C99 6.3.1.8-p1
...Dans le cas contraire, si l'opérande qui a unsigned integer a rang supérieur ou égal au rang de la catégorie de l'autre opérande, puis l'opérande de type entier signé est convertie dans le type de l'opérande de type entier non signé.
Sinon, si le type de l'opérande de type entier signé peut représenter l'ensemble des valeurs du type de l'opérande de type entier non signé, puis l'opérande de type entier non signé est convertie dans le type de l'opérande de type entier signé.
Qui me dit int
vs unsigned char
devrait fonctionner comme prévu.
Test
int main()
{
int x = -4;
unsigned int y = 10;
unsigned char z = 10;
if (x > y)
printf("x>y\n");
else
printf("x<y\n");
if (x > z)
printf("x>z\n");
else
printf("x<z\n");
return 0;
}
Sortie
x>y
x<z
Eh bien, regardez qui.