86 votes

Que se passe-t-il si j'attribue une valeur négative à une variable non signée?

J'étais curieux de savoir ce qui se passerait si j'attribuais une valeur négative à une variable non signée.

Le code ressemblera un peu à ceci.

 unsigned int nVal = 0;
nVal = -5;
 

Cela ne m'a pas donné d'erreur de compilation. Lorsque j'ai lancé le programme, une valeur étrange a été attribuée à nVal ! Se pourrait-il que la valeur du complément à 2 soit affectée à nVal ?

72voto

Dennis Zickefoose Points 6659

Pour la réponse officielle - Section 4.7 [conv.integral]

"Si le type de destination est non signé, la valeur résultante est le plus petit entier non signé conforme à l'entier source (modulo 2 ^ n où n est le nombre de bits utilisés pour représenter le type non signé). [Remarque: Dans une représentation à complément à deux, cette conversion est conceptuelle et il n'y a pas de changement dans le modèle de bits (s'il n'y a pas de troncature).

38voto

Jasmeet Points 1042

Il affectera le motif binaire représentant -5 (en complément à 2) à l'intersigné non signé. Ce qui sera une grande valeur non signée. Pour les ints 32 bits, ce sera 2 ^ 32 - 5 ou 4294967291.

5voto

perimosocordiae Points 4582

Vous avez raison, l'entier signé est stocké sous forme de complément à 2 et l'entier non signé est stocké dans la représentation binaire non signée . C (et C ++) ne font pas la distinction entre les deux. La valeur que vous obtenez est donc simplement la valeur binaire non signée de la représentation binaire du complément à 2.

4voto

Dror Helper Points 15499

Il apparaîtra comme un entier positif de la valeur de l'entier non signé max - 4 (la valeur dépend de l'architecture de l'ordinateur et du compilateur).

BTW
Vous pouvez vérifier cela en écrivant un simple programme de type "hello world" C ++ et voir par vous-même.

2voto

Martin Points 1362

Oui, vous avez raison. La valeur réelle assignée est semblable à tous les bits mis à part le troisième. -1 correspond à tous les bits (hex: 0xFFFFFFFF), -2 correspond à tous les bits sauf le premier, etc. Ce que vous verriez est probablement la valeur hexadécimale 0xFFFFFFFB qui, en décimal, correspond à 4294967291.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X