web-dev-qa-db-fra.com

Que se passe-t-il lorsque j'identifie une valeur négative à un Int non signé?

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.

17
n0nChun

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.

23
Keith Thompson

Utilisation %u à la place de %d Pour imprimer des valeurs non signées. Ensuite, vous devriez voir 0xFFFFFFFFF.

6
Eran Zimmerman

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.

0
Rickard