1 en complément à l'aide de ~ en C/C++
Je suis à l'aide de Visual Studio 2013.
Récemment, j'ai essayé la ~
opérateur pour 1 complément:
int a = 10;
cout << ~a << endl;
De sortie est -11
Mais pour
unsigned int a = 10;
cout << ~a << endl;
la sortie est 4294967296
Je ne comprends pas pourquoi la sortie est -11
dans le cas d'signé int
.
S'il vous plaît aidez-moi à cette confusion.
Vous retournez le bit de signe.
OriginalL'auteur user2912611 | 2014-06-01
Vous devez vous connecter pour publier un commentaire.
Lorsque vous mettez le numéro 10 en 32 bits entier signé ou non signé, vous obtenez
Lorsque vous le nier, vous obtenez
Ces 32 bits signifie 4294967285 comme un entier non signé, ou -11 comme un entier signé (votre ordinateur représente des entiers négatifs comme En complément à deux). Ils peuvent aussi signifier un 32-bit à virgule flottante nombre ou quatre caractères 8 bits.
Bits n'ont pas de "absolue" de sens. Ils peuvent représenter quoi que ce soit, selon la façon dont vous "regarder" (le type qu'ils ont).
OriginalL'auteur Ivan Kuckir
La
~
opérateur effectue un ceux-complément de sur son argument, et il n'a pas d'importance si doit porter sur l'argument est un entier signé ou non signé. Il se contente de les flips tous les bits, de sortedevient
(d'où, sans doute, ces chiffres sont de 32 bits de large -- j'ai omis 16 plus de 0 et de 1.)
Comment
cout
afficher le résultat? Il regarde le type d'origine. Pour un signé entier, le bit le plus significatif est son signe. Ainsi, le résultat est toujours va être négatif (parce que le bit le plus significatif dans10
est0
). Pour afficher un nombre négatif comme positif, vous avez besoin du complément à deux: l'inversion de tous les bits, puis ajouter 1. Par exemple,-1
, binaire111..111
, s'affiche comme (inversion)000..000
puis +1:000..001
. Résultat:-1
.De l'application au complément de
10
vous obtenez111..110101
-> inversion de000...001010
, puis ajouter1
. Résultat: -11.Pour un unsigned nombre,
cout
ne pas le faire (bien entendu), et vous obtenez un grand nombre: le plus grand entier moins le numéro d'origine.OriginalL'auteur usr2564301
En mémoire, il n'y est stockée 4294967285 dans les deux cas (4294967296 correctement une faute de frappe, 33 bits?), la signification de ce nombre qui dépend de la signdeness vous utilisez:
interprétations différentes d'un même nombre.
Vous pouvez réinterpréter comme non signés par le moulage, le même résultat:
OriginalL'auteur
Essayer cette
OriginalL'auteur Agnit