Dupliquer possible:
[.____] Signé à une conversion non signée en C - est-ce toujours en sécurité?
Disons que je déclare une variable de type non signé INT: unsigned int x = -1;
Maintenant, -1 en deux compléments (en supposant que 32 bits de machine) est 0xFFFFFFFFF. Maintenant, lorsque j'ai assigné cette valeur à x, la valeur 0x7fffffff est-elle affectée à X?
Si c'était le cas, alors printf ("% d", x); aurait imprimé l'équivalent décimal de 0x7FFFFFFF, non? Mais, clairement cela ne se produit pas, car la valeur imprimée est -1. Qu'est-ce que j'oublie ici?
Edit: Je sais que nous pouvons utiliser le spécificateur de format% U pour imprimer des valeurs non signées. Mais cela n'aide pas à répondre à la question ci-dessus.
Les "%d"
format est pour les valeurs int (signées) Int. Si vous l'utilisez avec une valeur non signée, elle pourrait imprimer quelque chose d'autre que la valeur réelle. Utilisation "%u"
Pour voir la valeur réelle, ou %x
Pour le voir à Hexadecimal.
Dans la déclaration
unsigned int x = -1;
l'expression -1
est de type INT et a la valeur -1. L'initialiseur convertit cette valeur de INT vers UNSIGNED INT. Les règles de conversion signée à non signé disent que la valeur est réduite modulo UINT_MAX + 1
, donc -1
va convertir en UINT_MAX
(ce qui est probablement 0xffffffff
ou 4294967295
si unsigned int
est 32 bits).
Vous simplement ne peut pas Attribuer une valeur négative à un objet de type non signé. Toute valeur de ce type sera convertie au type non signé avant sa cession et le résultat sera toujours> = 0.
Utilisation %u
à la place de %d
Pour imprimer des valeurs non signées. Ensuite, vous devriez voir 0xFFFFFFFFF.
Ce qui se passe, c'est que vous convertissez la valeur d'abord à l'INT non signé, attribuant 0xFFFFFFFF à X. Ensuite, utilisez printf ("% d\n"), vous convertirez la valeur de la valeur en SIGNED INT conservant toujours la valeur de 0xFFFFFFFFF. Ainsi, impression -1.