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 donné aucune erreur de compilation. Lorsque j'ai exécuté le programme, le nVal
s'est vu attribuer une valeur étrange! Se pourrait-il que la valeur de complément de 2 soit affectée à nVal
?
Pour la réponse officielle - Section 4.7 conv.integral
"Si le type de destination n'est pas signé, la valeur résultante est l'entier le moins non signé conforme à l'entier source (modulo 2n où
n
est le nombre de bits utilisés pour représenter le type non signé). [Remarque: dans une représentation du complément à deux, cette conversion est conceptuelle et il n'y a aucun changement dans la configuration binaire (s'il n'y a pas de troncature). —Fin note]
Cela signifie essentiellement que si l'architecture sous-jacente est stockée dans une méthode qui n'est pas le complément à deux (comme la magnitude signée ou le complément à un), la conversion en non signé doit se comporter comme s'il s'agissait du complément à deux.
Il affectera le motif binaire représentant -5 (en complément de 2) à l'int entier non signé. Ce sera une grande valeur non signée. Pour les entrées 32 bits, ce sera 2 ^ 32 - 5 ou 4294967291
Il s'affichera 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 voyez par vous-même
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 fait pas de distinction entre les deux, donc la valeur avec laquelle vous vous retrouvez est simplement la valeur binaire non signée de la représentation binaire du complément à 2.
Oui, tu as raison. La valeur réelle attribuée est quelque chose comme tous les bits définis, sauf le troisième. -1 est tous les bits définis (hex: 0xFFFFFFFF), -2 est tous les bits sauf le premier et ainsi de suite. Ce que vous verriez est probablement la valeur hexadécimale 0xFFFFFFFB qui en décimale correspond à 4294967291.