Qu'advient-il si je attribuer une valeur négative pour un unsigned variable?
J'étais curieux de savoir ce qui se passerait si je attribuer une valeur négative pour un unsigned variable.
Le code est un peu comme cela.
unsigned int nVal = 0;
nVal = -5;
Il ne m'a laissé aucune erreur de compilation. Quand j'ai couru le programme de la nVal
a été affecté à une étrange valeur! Se pourrait-il que certains 2 en complément à valeur sera affectée à nVal
?
- Mon intuition (n'ont pas été en mesure de le trouver dans la norme encore) c'est que le comportement est techniquement pas défini. En outre, je pense que vous verrez ce que vous attendez sur pratiquement n'importe quel compilateur, vous pouvez trouver. Ainsi, alors que vous aurez l'habitude de voir ce comportement, il est probablement pas une bonne idée de compter sur elle.
- Il n'est pas non défini (voir §4.7/2), mais la représentation (par exemple 2s compléter) n'est pas mandaté par la norme.
- al-dessous), c'est cool. Ressemble le comportement est, en effet, explicitement définies à être ce que vous attendiez, @viswanathan.
- La deuxième ligne est équivalente à
nVal = (unsigned int) -5;
. Le casting de-5
àunsigned int
est défini dans 6.3.1.3. La représentation en 2s complément n'est pas prescrite par la norme, mais l'algorithme de conversion non signé est: "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 newtype jusqu'à ce que la valeur est dans la gamme de la newtype." - Où avez-vous trouvé?
- Vous semblez faire allusion à C99, mais la question est étiqueté C++.
- Oups, désolé. Je retire mon commentaire. J'étais en effet en supposant que le C99.
Vous devez vous connecter pour publier un commentaire.
Pour la réponse officielle - Section 4.7 conv.intégrale
Essentiellement, cela signifie que si l'architecture sous-jacente dans les magasins de méthode qui n'est pas en Complément à Deux (comme Signé Ampleur, ou Un Complément), que la conversion en unsigned doit se comporter comme si elle était en Complément à Deux.
Il va affecter la séquence de bits représentant -5 (en complément de 2) pour les unsigned int. Qui sera d'une grande valeur non signée. Pour la version 32 bits ints ce sera de 2^32 - 5 ou 4294967291
ceil(log_2(x))
.)Il s'affiche comme un entier positif de la valeur de max entier non signé - 4 (la valeur dépend de l'architecture de l'ordinateur et le compilateur).
BTW
Vous pouvez le vérifier en écrivant un simple C++ "hello world" type de programme et de voir par vous-même
Vous avez raison, l'entier signé est stocké dans 2 forme de complément, et le nombre entier non signé est stocké dans le représentation binaire non signé. C (et C++) ne fait pas la distinction entre les deux, de sorte que la valeur que vous finissez avec est tout simplement le binaire non signé valeur du complément de 2 représentation binaire.
Oui, vous avez raison. La valeur réelle affectée est quelque chose comme tous les bits définis à l'exception de la troisième. -1 est tous les bits (hex: 0xFFFFFFFF), -2 est tous les bits à l'exception de la première et ainsi de suite. Ce que vous voyez est probablement la valeur hexadécimale 0xFFFFFFFB qui en décimal correspond à 4294967291.