En complément à deux forme binaire
Dans un TC++ compilateur, la représentation binaire de 5 est (00000000000000101).
Je sais que les nombres négatifs sont stockées en tant que complément de 2, donc -5 en binaire est (111111111111011). Le bit le plus significatif (bit de signe) est 1, ce qui indique que c'est un nombre négatif.
Donc comment le compilateur de savoir qu'il est -5? Si l'on interprète la valeur binaire donnée ci-dessus (111111111111011) comme un nombre non signé, il sera complètement différent?
Aussi, pourquoi le 1 du compliment de 5 -6 (1111111111111010)?
Vous devez vous connecter pour publier un commentaire.
Le compilateur ne sait pas. Si vous avez jeté
-5
àunsigned int
vous aurez32763
.Le compilateur sait parce que c'est la convention, le PROCESSEUR utilise nativement. Votre ordinateur a un PROCESSEUR qui stocke les nombres négatifs dans la notation en complément à deux, de sorte que le compilateur suit. Si votre CPU est supporté complément de la notation, le compilateur pourrait utiliser le fait que (comme c'est le cas avec la norme IEEE flotteurs, soit dit en passant).
L'article de Wikipédia sur le sujet explique comment en complément à deux notation fonctionne.
Le processeur met en œuvre signés et non signés, instructions, qui fonctionnera sur le nombre binaire de représentation différemment. Le compilateur sait laquelle de ces instructions à émettre en fonction du type des opérandes (i.e.
int
vsunsigned int
).Le compilateur n'a pas besoin de savoir si un nombre est négatif ou non, tout simplement, il émet de la bonne machine ou de l'intermédiaire de langue pour les types impliqués. Le processeur d'exécution ou de mise en œuvre de ces instructions n'a généralement pas beaucoup de soins si le nombre est négatif ou pas, car la formulation de complément à deux arithmétique est telle que c'est la même chose pour les nombres positifs ou négatifs (en fait, c'est le principal avantage de complément à deux de l'arithmétique). Ce serait besoin de savoir si un nombre est négatif serait quelque chose comme
printf()
, et d'Andrew, Jaffe a souligné, le MSBit en cours de jeu est le signe d'un nombre négatif en complément à deux.Le premier bit est défini uniquement pour les nombres négatifs (ça s'appelle le bit de signe)
Des informations détaillées sont disponibles ici
La kewl partie de complément à deux est que le langage machine d'Ajouter et de Soustraire les instructions d'ignorer tout cela, et il suffit de faire l'arithmétique binaire et il fonctionne, tout simplement...
c'est à dire, -3 + 4
en Binaire complément de 2, est
signed int a = -1
, puis-1
en 2 forme de complément est11111111 11111111 11111111 11111111
et puis quand j'utilise " %d pour l'interpréter, il imprime -1 et %u , il imprime4294967295
et quand j'écris signé int a = 2 , il imprime en 2 quand j'utilise%d
et aussi lorsque j'utilise%u
. Si 2 serait en complément à deux, il serait11111111 11111111 11111111 11111101
, et puis ce serait une très diffrenet réponse , ce que je veux poser est: quand est-complément de 2 arriver est qu'il dépend de signer ou il arrive pour tout entier si le type est signé int qui ne doit pas être le cas ici.laissez-nous vous donner un exemple:
nous avons deux nombres de deux octets en binaire:
A = 10010111
B = 00100110
(notez que la machine ne connaît pas la notion de signé ou non signé à ce niveau)
maintenant, quand vous dites "ajouter" ces deux-là, que fait la machine? il ajoute simplement:
R = 10111101 (et bit : 1)
maintenant, nous-compilateur - nécessité d'interpréter l'opération. nous avons deux options: les nombres peuvent être signés ou non signés.
1 - unsigned cas: en c, les chiffres sont de type "unsigned char", et les valeurs sont 151 et 38 et le résultat est 189. c'est trivial.
2 - signé de cas: nous, le compilateur, interpréter les nombres selon leur msb et le premier numéro est -105 et le second est encore 38. donc -105 + 38 = -67. Mais -67 est 10111101. Mais c'est ce que nous avons déjà dans le résultat (R)! Le résultat est le même, la seule différence est la façon dont le compilateur interprète.
La conclusion est que, peu importe la façon dont nous considérons les nombres, la machine effectue la même opération sur les nombres. Mais le compilateur va interpréter les résultats à son tour.
Noter que, ce n'est pas la machine qui connaît le concept de complément de 2. il ajoute juste deux nombres sans s'occuper du contenu. Le compilateur, puis, regarde le bit de signe et décide.
Quand il s'agit de la soustraction, cette fois encore, l'opération est unique: prendre 2 en complément de la deuxième numéro et ajouter les deux.
Si le nombre est déclaré que la signature d'un type de données (et non pas de type cast pour un type non signé), alors le compilateur sait que, lorsque le bit de signe est à 1, c'est un nombre négatif. Quant à savoir pourquoi complément de 2 est utilisé au lieu de 1 en complément, vous ne voulez pas être en mesure d'avoir une valeur de -0, dont 1 en complément vous permettra de le faire, alors ils ont inventé complément de 2 pour résoudre ce problème.
C'est exactement ce que la plupart des bits significatifs -- si vous connaissez un numéro est signé, alors si le MSB=1, le compilateur (et le moteur d'exécution!) sait l'interpréter comme négatif. C'est pourquoi c comme langues ont tous les deux des entiers (positifs et négatifs) et des entiers non signés-dans ce cas, vous les interprétez tous positifs. Donc un octet signé en va de -128 à 127, mais un octet non signé de 0 à 255.