Qu'est-ce que le «complément 2»?

434

Je suis dans un cours sur les systèmes informatiques et j'ai eu du mal , en partie, avec Two's Complement . Je veux le comprendre, mais tout ce que j'ai lu n'a pas rassemblé l'image pour moi. J'ai lu l' article wikipedia et divers autres articles, y compris mon manuel .

Par conséquent, je voulais commencer ce post wiki communautaire pour définir ce qu'est le complément à deux, comment l'utiliser et comment il peut affecter les nombres lors d'opérations telles que les transtypages (de signé à non signé et vice versa), les opérations au niveau du bit et les opérations de décalage de bit. .

Ce que j'espère, c'est une définition claire et concise facilement compréhensible par un programmeur.

Frank V
la source

Réponses:

628

Le complément à deux est un moyen intelligent de stocker des entiers afin que les problèmes mathématiques courants soient très simples à implémenter.

Pour comprendre, il faut penser aux nombres en binaire.

Il dit essentiellement,

  • pour zéro, utilisez tous les 0.
  • pour les entiers positifs, commencez à compter, avec un maximum de 2 (nombre de bits - 1) -1.
  • pour les entiers négatifs, faites exactement la même chose, mais changez le rôle des 0 et des 1 (donc au lieu de commencer par 0000, commencez par 1111 - c'est la partie "complément").

Essayons-le avec un mini-octet de 4 bits (nous l'appellerons un quartet - 1/2 octet).

  • 0000 - zéro
  • 0001 - une
  • 0010 - deux
  • 0011 - Trois
  • 0100à 0111- quatre à sept

C'est aussi loin que nous pouvons aller dans le positif. 2 3 -1 = 7.

Pour les négatifs:

  • 1111 - négatif
  • 1110 - deux négatifs
  • 1101 - négatif trois
  • 1100à 1000- négatif quatre à négatif huit

Notez que vous obtenez une valeur supplémentaire pour les négatifs ( 1000= -8) que vous n'avez pas pour les positifs. En effet, 0000est utilisé pour zéro. Cela peut être considéré comme une ligne numérique d'ordinateurs.

Distinguer les nombres positifs et négatifs

En faisant cela, le premier bit obtient le rôle du bit "signe", car il peut être utilisé pour distinguer les valeurs décimales non négatives et négatives. Si le bit le plus significatif est 1, alors le binaire peut être considéré comme négatif, où comme si le bit le plus significatif (le plus à gauche) est 0, vous pouvez dire que la valeur décimale est non négative.

Les nombres négatifs "complément à un" retournent simplement le bit de signe, puis comptent à partir de 0. Mais cette approche doit traiter de l'interprétation 1000comme "zéro négatif", ce qui prête à confusion. Vous n'avez généralement à vous en préoccuper qu'en travaillant à proximité du matériel.

lavinio
la source
148
La meilleure partie du complément à deux est probablement la façon dont il simplifie les mathématiques. Essayez d'ajouter 2 (0010) et -2 (1110) ensemble et vous obtenez 10000. Le bit le plus significatif est le débordement, donc le résultat est en fait 0000. Presque comme par magie, 2 + -2 = 0.
Naaff
96
Outre l'addition et la soustraction faciles, un complément à 2 n'a qu'un seul zéro. Si vous utilisiez un bit de signe simple, par exemple en utilisant 0001 pour représenter +1 et 1001 pour représenter -1, vous auriez deux zéros: 0000 ("+0") et 1000 ("-0"). C'est une vraie douleur dans le derrière.
Jörg W Mittag
26
Votez pour qu'il soit au point et aussi pour expliquer pourquoi les valeurs négatives ont une plus grande gamme des valeurs positives. Je suis venu chercher la raison de la différence de gamme.
Ashwin
2
Ne devriez-vous pas dire "pour les entiers négatifs, faites exactement la même chose mais comptez à rebours et changez le rôle des 0 et des 1"
Koray Tugay
1
Génial .Ajout de parties supplémentaires de conversion de bits en entier négatif.
Suraj Jain
340

Je me demande si cela pourrait être mieux expliqué que l'article de Wikipedia.

Le problème de base que vous essayez de résoudre avec la représentation du complément à deux est le problème du stockage d'entiers négatifs.

Considérons d'abord un entier non signé stocké sur 4 bits. Vous pouvez avoir les éléments suivants

0000 = 0
0001 = 1
0010 = 2
...
1111 = 15

Celles-ci ne sont pas signées car rien n'indique si elles sont négatives ou positives.

Signe de l'ampleur et de la notation excessive

Pour stocker des nombres négatifs, vous pouvez essayer plusieurs choses. Tout d'abord, vous pouvez utiliser la notation de magnitude de signe qui attribue le premier bit comme bit de signe pour représenter +/- et les bits restants pour représenter la magnitude. Donc, en utilisant à nouveau 4 bits et en supposant que 1 signifie - et 0 signifie + alors vous avez

0000 = +0
0001 = +1
0010 = +2
...
1000 = -0
1001 = -1
1111 = -7

Donc, vous voyez le problème là-bas? Nous avons 0 positif et négatif. Le plus gros problème est d'ajouter et de soustraire des nombres binaires. Les circuits à additionner et à soustraire en utilisant la grandeur du signe seront très complexes.

Quel est

0010
1001 +
----

?

Un autre système est la notation excessive . Vous pouvez stocker des nombres négatifs, vous vous débarrassez du problème des deux zéros mais l'addition et la soustraction restent difficiles.

Ainsi vient le complément à deux. Vous pouvez maintenant stocker des entiers positifs et négatifs et effectuer l'arithmétique avec une relative facilité. Il existe un certain nombre de méthodes pour convertir un nombre en complément à deux. En voici un.

Convertir le décimal en complément à deux

  1. Convertissez le nombre en binaire (ignorez le signe pour l'instant), par exemple 5 est 0101 et -5 est 0101

  2. Si le nombre est positif, alors vous avez terminé. par exemple 5 est 0101 en binaire en utilisant la notation du complément à deux.

  3. Si le nombre est négatif,

    3.1 trouver le complément (inverser les 0 et les 1), par exemple -5 est 0101, donc trouver le complément est 1010

    3.2 Ajoutez 1 au complément 1010 + 1 = 1011. Par conséquent, -5 dans le complément à deux est 1011.

Et si vous vouliez faire 2 + (-3) en binaire? 2 + (-3) est -1. Que feriez-vous si vous utilisiez la magnitude des signes pour ajouter ces nombres? 0010 + 1101 =?

En utilisant le complément à deux, considérez à quel point ce serait facile.

 2  =  0010
 -3 =  1101 +
 -------------
 -1 =  1111

Conversion du complément à deux en décimal

Conversion de 1111 en décimal:

  1. Le nombre commence par 1, il est donc négatif, nous trouvons donc le complément de 1111, qui est 0000.

  2. Ajoutez 1 à 0000 et nous obtenons 0001.

  3. Convertissez 0001 en décimal, qui est 1.

  4. Appliquez le signe = -1.

Tada!

Vincent Ramdhanie
la source
45
Meilleure réponse à mon avis.
Koray Tugay
5
oui, celui-ci est assez simple et explique très bien l'affaire
Max Koretskyi
3
Je ne comprends pas comment l'ajout d'un lors de la conversion dans les deux sens conduit toujours au même nombre. Dans mon esprit, vous inverseriez les étapes ou soustrayeriez un ou quelque chose.
Marcos Pereira
2
Pourquoi ajouter 1 au complément?
Zinan Xing
4
Cette réponse devrait être utilisée sur Wikipedia.
Hiroki
119

Comme la plupart des explications que j'ai vues, celles ci-dessus expliquent clairement comment travailler avec le complément à 2, mais n'expliquent pas vraiment ce qu'elles sont mathématiquement. J'essaierai de le faire, au moins pour les nombres entiers, et je couvrirai certains antécédents qui sont probablement familiers en premier.

Rappelez-vous comment cela fonctionne pour la décimale:
  2345
est une façon d'écrire
  2 × 10 3 + 3 × 10 2 + 4 × 10 1 + 5 × 10 0 .

De la même manière, le binaire est un moyen d'écrire des nombres en utilisant seulement 0 et 1 en suivant la même idée générale, mais en remplaçant les 10 ci-dessus par 2. Alors en binaire,
  1111
est une façon d'écrire
  1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0
et si vous le calculez, cela se révèle égal à 15 (base 10). C'est parce que c'est
  8 + 4 + 2 + 1 = 15.

C'est très bien pour les nombres positifs. Cela fonctionne même pour les nombres négatifs si vous êtes prêt à coller un signe moins devant eux, comme le font les humains avec des nombres décimaux. Cela peut même être fait dans les ordinateurs, en quelque sorte, mais je n'ai pas vu un tel ordinateur depuis le début des années 1970. Je vais laisser les raisons d'une discussion différente.

Pour les ordinateurs, il s'avère plus efficace d'utiliser une représentation complémentaire pour les nombres négatifs. Et voici quelque chose qui est souvent négligé. Les notations de complément impliquent une sorte d'inversion des chiffres du nombre, même les zéros implicites qui précèdent un nombre positif normal. C'est gênant, car la question se pose: tous? Cela pourrait être un nombre infini de chiffres à considérer.

Heureusement, les ordinateurs ne représentent pas les infinis. Les nombres sont limités à une longueur (ou une largeur particulière, si vous préférez). Revenons donc à des nombres binaires positifs, mais avec une taille particulière. Je vais utiliser 8 chiffres ("bits") pour ces exemples. Donc, notre nombre binaire serait vraiment
  00001111
ou
  0 × 2 7 + 0 × 2 6 + 0 × 2 5 + 0 × 2 4 + 1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0

Pour former le complément négatif de 2, nous
  complétons d' abord tous les chiffres (binaires) pour former 11110000
et ajoutons 1 pour former
  11110001,
mais comment comprendre que cela signifie -15?

La réponse est que nous changeons la signification du bit de poids fort (le plus à gauche). Ce bit sera un 1 pour tous les nombres négatifs. Le changement sera de changer le signe de sa contribution à la valeur du nombre dans lequel il apparaît. Alors maintenant notre 11110001 est censé représenter
  - 1 × 2 7 + 1 × 2 6 + 1 × 2 5 + 1 × 2 4 + 0 × 2 3 + 0 × 2 2 + 0 × 2 1 + 1 × 2 0
Remarquez que "-" devant cette expression? Cela signifie que le bit de signe porte le poids -2 7 , soit -128 (base 10). Toutes les autres positions conservent le même poids qu'elles avaient en nombres binaires non signés.

En calculant notre -15, c'est
  -128 + 64 + 32 + 16 + 1
Essayez-le sur votre calculatrice. c'est -15.

Des trois principales façons dont j'ai vu des nombres négatifs représentés dans les ordinateurs, le complément 2 gagne haut la main pour plus de commodité dans l'utilisation générale. Il a cependant une bizarrerie. Comme il est binaire, il doit y avoir un nombre pair de combinaisons de bits possibles. Chaque nombre positif peut être associé à son négatif, mais il n'y a qu'un seul zéro. Nier un zéro vous fait zéro. Il y a donc une autre combinaison, le nombre avec 1 dans le bit de signe et 0 partout ailleurs. Le nombre positif correspondant ne correspondrait pas au nombre de bits utilisés.

Ce qui est encore plus étrange avec ce nombre, c'est que si vous essayez de former son positif en complétant et en ajoutant un, vous obtenez le même nombre négatif. Il semble naturel que zéro fasse cela, mais cela est inattendu et pas du tout le comportement auquel nous sommes habitués car, mis à part les ordinateurs, nous pensons généralement à un nombre illimité de chiffres, pas à cette arithmétique de longueur fixe.

C'est comme la pointe d'un iceberg de bizarreries. Il y a plus d'attente sous la surface, mais cela suffit pour cette discussion. Vous pourriez probablement en trouver plus si vous recherchez «débordement» pour l'arithmétique à virgule fixe. Si vous voulez vraiment vous lancer, vous pouvez également rechercher «l'arithmétique modulaire».

ForDummies
la source
1
J'aime cette réponse! Explique comment le complément à 2 et l'ajout d'un fonctionnent.
SJ.
J'aime aussi cette réponse. Surtout où vous montrez comment le nombre négatif est calculé. Ici, je pensais que le nombre entier était inversé, pas seulement le MSB, puis ajouté les autres valeurs pondérées. Merci, cela a résolu mon blocage cérébral
user188757
Bon travail en mentionnant le numéro impair qui n'a pas d'inverse. Mais que faisons-nous à ce sujet? Définissons-nous simplement l'indicateur de débordement si quelqu'un essaie de l'inverser?
NH.
Alors que d'autres réponses se concentrent sur le «comment», cette réponse nous amène doucement avec le «pourquoi». Ça m'a aidé. Merci!
Abhishek Pathak
Si un nombre se termine par 11000 ... 000, l'inverser produira 01000 ... 000. La notation à complément à deux est basée sur l'idée que tous les chiffres à gauche du chiffre représenté le plus à gauche devraient avoir la même valeur que ce chiffre, mais lorsque vous inversez un nombre dont la représentation est 1000 ... 000, ce ne sera pas vrai.
supercat
20

Le complément de 2 est très utile pour trouver la valeur d'un binaire, mais j'ai pensé à un moyen beaucoup plus concis de résoudre un tel problème (jamais vu personne d'autre le publier):

prenez un binaire, par exemple: 1101 qui est [en supposant que l'espace "1" est le signe] égal à -3 .

en utilisant le complément de 2, nous ferions ceci ... retourner 1101 à 0010 ... ajouter 0001 + 0010 ===> nous donne 0011. 0011 en binaire positif = 3. donc 1101 = -3 !

Ce que j'ai réalisé:

au lieu de tout retourner et ajouter, vous pouvez simplement faire la méthode de base pour résoudre un binaire positif (disons 0101) est (2 3 * 0) + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = 5.

Faites exactement le même concept avec un négatif! (Avec une petite torsion)

prenez 1101, par exemple:

pour le premier nombre au lieu de 2 3 * 1 = 8 , faites - (2 3 * 1) = -8 .

puis continuez comme d'habitude, en faisant -8 + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = -3

Simon Yundov
la source
1
La meilleure façon, je pouvais comprendre le complément de 2. Après avoir lu ceci, j'ai pu comprendre toutes les réponses à la question ci-dessus.
Shakeel Shahzad
1
Cette méthode est mentionnée dans le livre Computer Systems: A programmer's perspective.
jimo
1
C'est un moyen beaucoup plus rapide!
chanzerre
14

Imaginez que vous ayez un nombre fini de bits / trits / chiffres / peu importe. Vous définissez 0 comme tous les chiffres étant 0, et comptez naturellement vers le haut:

00
01
02
..

Vous finirez par déborder.

98
99
00

Nous avons deux chiffres et pouvons représenter tous les nombres de 0 à 100. Tous ces nombres sont positifs! Supposons que nous voulons aussi représenter des nombres négatifs?

Ce que nous avons vraiment, c'est un cycle. Le nombre avant 2 est 1. Le nombre avant 1 est 0. Le nombre avant 0 est ... 99 .

Donc, pour simplifier, disons que tout nombre supérieur à 50 est négatif. "0" à "49" représente 0 à 49. "99" est -1, "98" est -2, ... "50" est -50.

Cette représentation est un complément à dix . Les ordinateurs utilisent généralement le complément à deux , qui est le même, sauf en utilisant des bits au lieu de chiffres.

La bonne chose à propos du complément de dix est que l'ajout fonctionne . Vous n'avez rien à faire de spécial pour ajouter des nombres positifs et négatifs!

Capitaine Segfault
la source
9

J'ai lu une explication fantastique sur Reddit par jng, en utilisant l'odomètre comme analogie.

entrez la description de l'image ici

C'est une convention utile. Les mêmes circuits et opérations logiques qui ajoutent / soustraient des nombres positifs en binaire fonctionnent toujours sur les nombres positifs et négatifs si vous utilisez la convention, c'est pourquoi c'est si utile et omniprésent.

Imaginez le compteur kilométrique d'une voiture, il roule à (disons) 99999. Si vous incrémentez 00000, vous obtenez 00001. Si vous décrémentez 00000, vous obtenez 99999 (en raison du retournement). Si vous en ajoutez un à 99999, il revient à 00000. Il est donc utile de décider que 99999 représente -1. De même, il est très utile de décider que 99998 représente -2, etc. Vous devez vous arrêter quelque part, et aussi par convention, la moitié supérieure des nombres est considérée comme négative (50000-99999), et la moitié inférieure positive se suffit à elle-même (00000-49999). Par conséquent, le chiffre supérieur étant 5-9 signifie que le nombre représenté est négatif, et il est 0-4 signifie que le représenté est positif - exactement le même que le bit supérieur représentant le signe dans un nombre binaire complémentaire à deux.

Comprendre cela a été difficile pour moi aussi. Une fois que je l'ai eu et que je suis retourné pour relire les articles et les explications des livres (il n'y avait pas Internet à l'époque), il s'est avéré que beaucoup de ceux qui le décrivaient ne le comprenaient pas vraiment. J'ai écrit un livre pour enseigner le langage d'assemblage après cela (qui s'est bien vendu pendant 10 ans).

Alister
la source
5

Deux complément est découvert en ajoutant un au 1 er complément du nombre donné. Disons que nous devons trouver deux compléments 10101puis trouver ses compléments, c'est-à-dire 01010ajouter 1à ce résultat, c'est-à- 01010+1=01011dire qui est la réponse finale.

evaa
la source
4

Permet d'obtenir la réponse 10 - 12 sous forme binaire en utilisant 8 bits: ce que nous allons vraiment faire, c'est 10 + (-12)

Nous devons obtenir la partie compliment de 12 pour la soustraire de 10. 12 en binaire est 00001100. 10 en binaire est 00001010.

Pour obtenir la partie compliment de 12, il suffit d'inverser tous les bits, puis d'ajouter 1. 12 en binaire inversé est 11110011. Il s'agit également du code inverse (son complément). Nous devons maintenant en ajouter un, qui est désormais le 11110100.

Donc 11110100 est le compliment de 12! Facile quand on y pense de cette façon.

Maintenant, vous pouvez résoudre la question ci-dessus de 10 à 12 sous forme binaire.

00001010
11110100
-----------------
11111110  
NightSky
la source
3

Compléments à 2: Lorsque nous en ajoutons un supplémentaire avec les compléments à 1 d'un nombre, nous obtenons les compléments à 2. Par exemple: 100101 c'est le complément de 1 est 011010 et le complément de 2 est 011010 + 1 = 011011 (en ajoutant un avec le complément de 1) Pour plus d'informations, cet article l'explique graphiquement.

Milon
la source
plus1 pour le lien qui a une explication avec le cercle
Manohar Reddy Poreddy
3

En regardant le système du complément à deux d'un point de vue mathématique, cela a vraiment du sens. En complément à dix, l'idée est essentiellement d'isoler la différence.

Exemple: 63 - 24 = x

Nous ajoutons le complément de 24 qui est vraiment juste (100 - 24). Donc, vraiment, tout ce que nous faisons est d'ajouter 100 des deux côtés de l'équation.

Maintenant, l'équation est: 100 + 63 - 24 = x + 100, c'est pourquoi nous supprimons le 100 (ou 10 ou 1000 ou autre).

En raison de la situation gênante de devoir soustraire un nombre d'une longue chaîne de zéros, nous utilisons un système de «complément de radix diminué», dans le système décimal, le complément de neuf.

Lorsque l'on nous présente un nombre soustrait d'une grande chaîne de neuf, il suffit d'inverser les nombres.

Exemple: 99999-03275 = 96724

C'est la raison pour laquelle, après le complément de neuf, nous ajoutons 1. Comme vous le savez probablement dans les mathématiques de l'enfance, 9 devient 10 en «volant» 1. Donc, fondamentalement, c'est juste le complément de dix qui prend 1 de la différence.

En binaire, le complément à deux équivaut au complément à dix, tandis que le complément à un au complément à neuf. La principale différence est qu'au lieu d'essayer d'isoler la différence avec des puissances de dix (en ajoutant 10, 100, etc. dans l'équation), nous essayons d'isoler la différence avec des puissances de deux.

C'est pour cette raison que nous inversons les bits. Tout comme la façon dont notre minuend est une chaîne de neuf en décimal, notre minuend est une chaîne de neuf en binaire.

Exemple: 111111 - 101001 = 010110

Parce que les chaînes de un sont inférieures à une bonne puissance de deux, elles «volent» 1 à la différence comme le font les neuf en décimal.

Lorsque nous utilisons des nombres binaires négatifs, nous disons simplement:

0000 - 0101 = x

1111 - 0101 = 1010

1111 + 0000 - 0101 = x + 1111

Pour `` isoler '' x, nous devons ajouter 1 car 1111 est éloigné de 10000 et nous supprimons le 1 de tête parce que nous venons de l'ajouter à la différence d'origine.

1111 + 1 + 0000 - 0101 = x + 1111 + 1

10000 + 0000 - 0101 = x + 10000

Il suffit de retirer 10000 des deux côtés pour obtenir x, c'est l'algèbre de base.

KyBrooks
la source
3

Jusqu'à présent, de nombreuses réponses expliquent bien pourquoi le complément à deux est utilisé pour représenter un nombre négatif, mais ne nous disent pas ce qu'est le nombre de complément à deux, en particulier pas pourquoi un `` 1 '' est ajouté, et en fait souvent ajouté de manière incorrecte.

La confusion vient d'une mauvaise compréhension de la définition d'un nombre de complément. Un complément est la partie manquante qui rendrait quelque chose de complet.

Le complément radix d'un nombre x à n chiffres dans le radix b est, par définition, b ^ nx. En binaire, 4 est représenté par 100, qui a 3 chiffres (n = 3) et un radix de 2 (b = 2). Son complément radix est donc b ^ nx = 2 ^ 3-4 = 8-4 = 4 (ou 100 en binaire).

Cependant, en binaire, l'obtention d'un complément de radix n'est pas aussi facile que d'obtenir son complément de radix diminué, qui est défini comme (b ^ n-1) -y, juste 1 de moins que celui du complément de radix. Pour obtenir un complément radix diminué, il vous suffit de retourner tous les chiffres.

100 -> 011 (complément radix diminué)

pour obtenir le complément radix (deux), nous ajoutons simplement 1, comme la définition définie.

011 +1 -> 100 (complément à deux).

Maintenant avec cette nouvelle compréhension, regardons l'exemple donné par Vincent Ramdhanie (voir la deuxième réponse ci-dessus)

/ * début de Vincent

Conversion de 1111 en décimal:

Le nombre commence par 1, il est donc négatif, nous trouvons donc le complément de 1111, qui est 0000. Ajoutez 1 à 0000, et nous obtenons 0001. Convertissez 0001 en décimal, qui est 1. Appliquez le signe = -1. Tada!

fin de Vincent * /

Doit être compris comme

Le nombre commence par 1, il est donc négatif. Nous savons donc que c'est un complément à deux d'une certaine valeur x. Pour trouver le x représenté par son complément à deux, nous devons d'abord trouver son complément à 1.

complément à deux de x: 1111 complément à deux de x: 1111-1 -> 1110; x = 0001, (inverser tous les chiffres)

appliquez le signe - et la réponse = -x = -1.

user779764
la source
3

Le mot complément dérive de l'exhaustivité. Dans le monde décimal, les chiffres de 0 à 9 fournissent un complément (ensemble complet) de chiffres ou de symboles numériques pour exprimer tous les nombres décimaux. Dans le monde binaire, les chiffres 0 et 1 fournissent un complément de chiffres pour exprimer tous les nombres binaires. En fait Les symboles 0 et 1 doivent être utilisés pour tout représenter (texte, images, etc.) ainsi que positif (0) et négatif (1). Dans notre monde, l'espace vide à gauche du nombre est considéré comme nul:

                  35=035=000000035.

Dans un emplacement de stockage informatique, il n'y a pas d'espace vide. Tous les bits (chiffres binaires) doivent être 0 ou 1. Pour utiliser efficacement les numéros de mémoire peuvent être stockés sous forme de représentations 8 bits, 16 bits, 32 bits, 64 bits, 128 bits. Lorsqu'un nombre stocké sous la forme d'un nombre à 8 bits est transféré vers un emplacement à 16 bits, le signe et l'amplitude (valeur absolue) doivent rester les mêmes. Les représentations du complément 1 et du complément 2 facilitent cela. Comme nom: le complément à 1 et le complément à 2 sont des représentations binaires de quantités signées où le bit le plus significatif (celui de gauche) est le bit de signe. 0 pour positif et 1 pour négatif. Le complément à 2 ne signifie pas négatif. Cela signifie une quantité signée. Comme en décimal, la grandeur est représentée comme la quantité positive. La structure utilise l'extension de signe pour conserver la quantité lors de la promotion vers un registre [] avec plus de bits:

       [0101]=[00101]=[00000000000101]=5 (base 10)
       [1011]=[11011]=[11111111111011]=-5(base 10)

En tant que verbe: le complément de 2 signifie nier . Cela ne veut pas dire faire négatif. Cela signifie que si négatif devient positif; si positif, négatif. La magnitude est la valeur absolue:

        if a >= 0 then |a| = a
        if a < 0 then |a| = -a = 2scomplement of a

Cette capacité permet une soustraction binaire efficace en utilisant négation puis addition. a - b = a + (-b)

La manière officielle de prendre le complément à 1 consiste à soustraire pour chaque chiffre sa valeur à 1.

        1'scomp(0101) = 1010.

Cela revient à retourner ou inverser chaque bit individuellement. Cela se traduit par un zéro négatif qui n'est pas très apprécié, alors ajouter un au complément de te 1 élimine le problème. Pour annuler ou prendre le complément 2, prenez d'abord le complément 1, puis ajoutez 1.

        Example 1                             Example 2
         0101  --original number              1101
         1's comp  1010                       0010
         add 1     0001                       0001
         2's comp  1011  --negated number     0011

Dans les exemples, la négation fonctionne également avec les nombres étendus de signe.

Ajout:
1110 Carry 111110 Carry 0110 est le même que 000110 1111 111111 sum 0101 sum 000101

Soustraire:

    1110  Carry                      00000   Carry
     0110          is the same as     00110
    -0111                            +11001
  ----------                        ----------
sum  0101                       sum   11111

Notez que lorsque vous travaillez avec le complément à 2, l'espace vide à gauche du nombre est rempli de zéros pour les nombres positifs mais est rempli de uns pour les nombres négatifs. Le report est toujours ajouté et doit être soit 1 soit 0.

À votre santé

Russ
la source
3

Le complément de 2 est essentiellement un moyen de trouver l'inverse additif d'un nombre binaire. Posez-vous la question suivante: étant donné un nombre sous forme binaire, quel motif binaire, ajouté au nombre d'origine, rendrait le résultat nul? Si vous pouvez trouver ce modèle de bits, alors ce modèle de bits est la représentation -ve (inverse additif) du nombre d'origine; comme par définition, l'ajout d'un nombre à son inverse additif devrait toujours aboutir à zéro. Exemple: prenez 101, qui est décimal 5. Maintenant, la tâche consiste à trouver un modèle de bits qui, lorsqu'il est ajouté au modèle de bits donné (101), donnera zéro. Pour ce faire, commencez par le bit le plus à droite de 101 et pour chaque bit individuel, posez à nouveau la même question: quel bit dois-je ajouter à "ce" bit pour rendre le résultat nul? continuer à le faire en tenant compte du report habituel. Une fois que nous avons terminé avec les 3 emplacements les plus à droite (les chiffres qui définissent le nombre d'origine sans tenir compte des zéros de tête), le dernier report se poursuit dans le modèle de bits de l'inverse additif. De plus, comme nous pourrions conserver le nombre d'origine, disons un seul octet, tous les autres bits de tête de l'inverse additif devraient également être des 1, de sorte que lorsque l'ordinateur ajoute le nombre et son inverse additif en utilisant "ce" type de stockage (char) le résultat dans ce caractère serait tous des zéros.

 1 1 1
 ----------
   1 0 1
 1 0 1 1 ---> additive inverse
  ---------
   0 0 0
n-mam
la source
2

J'ai aimé la réponse de lavinio, mais le déplacement des bits ajoute de la complexité. Souvent, il y a un choix de bits en mouvement tout en respectant le bit de signe ou en ne respectant pas le bit de signe. Il s'agit du choix entre traiter les numéros comme signés (-8 à 7 pour un quartet, -128 à 127 pour les octets) ou des numéros non signés de plage complète (0 à 15 pour les quartets, 0 à 255 pour les octets).

Nosredna
la source
2

C'est un moyen intelligent de coder des entiers négatifs de manière à ce qu'environ la moitié de la combinaison de bits d'un type de données soit réservée aux entiers négatifs, et l'ajout de la plupart des entiers négatifs avec leurs entiers positifs correspondants entraîne un dépassement de capacité qui laisse le résultat à zéro binaire.

Ainsi, dans le complément de 2 si l'un est 0x0001, alors -1 est 0x1111, car cela se traduira par une somme combinée de 0x0000 (avec un débordement de 1).

Edwin Buck
la source
1

Le complément à deux est l'un des moyens d'exprimer un nombre négatif et la plupart des contrôleurs et processeurs stockent un nombre négatif sous forme de complément à 2

Denis Roosevelt
la source
1
Cela n'ajoute rien aux informations fournies par les autres réponses.
Adrian Mole
1

Le complément à deux est principalement utilisé pour les raisons suivantes:

  1. Pour éviter les représentations multiples de 0
  2. Pour éviter de garder une trace de la mèche (comme dans son complément) en cas de débordement.
  3. Effectuer des opérations simples comme l'addition et la soustraction devient facile.
K.N. Bhargav
la source
0

RÉFÉRENCE: https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html

J'inverse tous les bits et j'ajoute 1. Par programme:

  // in C++11
  int _powers[] = {
      1,
      2,
      4,
      8,
      16,
      32,
      64,
      128
  };

  int value=3;
  int n_bits=4;
  int twos_complement = (value ^ ( _powers[n_bits]-1)) + 1;
Charles Thomas
la source
Même l'assembleur serait de trop haut niveau. Besoin de voir un schéma au niveau de la porte de la logique d'addition. Avec des cycles T. Vous êtes algorithmiquement correct.
mckenzm
0

Le complément de 2 d'un nombre donné est le non. obtenu en ajoutant 1 avec le complément de 1 du non. supposons, nous avons un numéro binaire: 10111001101 Son complément à 1 est: 01000110010 Et son complément à 2 sera: 01000110011

utilisateur10862846
la source
0

Compléter au niveau du bit un nombre, c'est retourner tous les bits qu'il contient. Pour compléter deux, nous retournons tous les bits et en ajoutons un.

En utilisant la représentation du complément à 2 pour les entiers signés, nous appliquons l'opération du complément à 2 pour convertir un nombre positif en son équivalent négatif et vice versa. Donc, en utilisant grignotages pour un exemple, 0001(1) devient 1111(-1) et en appliquant à nouveau l'op, revient à 0001.

Le comportement de l'opération à zéro est avantageux en donnant une représentation unique pour zéro sans traitement spécial des zéros positifs et négatifs. 0000compléments à 1111, qui lorsque 1 est ajouté. déborde 0000, nous donnant un zéro, plutôt qu'un positif et un négatif.

Un avantage clé de cette représentation est que les circuits d'addition standard pour les entiers non signés produisent des résultats corrects lorsqu'ils leur sont appliqués. Par exemple, en ajoutant 1 et -1 dans les quartets:, 0001 + 1111les bits débordent du registre, laissant derrière eux 0000.

Pour une introduction en douceur, le merveilleux Computerphile a réalisé une vidéo sur le sujet .

ahcox
la source
0

En termes simples, 2's Complementc'est un moyen de stocker un nombre négatif dans la mémoire de l'ordinateur. Alors que les nombres positifs sont stockés sous forme de nombre binaire normal.

Prenons cet exemple,

L'ordinateur utilise Binary Number Systempour représenter n'importe quel nombre.

x = 5;

Ceci est représenté par 0101.

x = -5;

Lorsque l'ordinateur rencontre le -signe, il calcule son complément à 2 et le stocke. i.e5 = 0101 et son complément à 2 est 1011.

Les règles importantes que l'ordinateur utilise pour traiter les nombres sont les suivantes:

  1. Si le premier bit est 1alors il doit être un negativenombre.
  2. Si tous les bits sauf le premier sont, 0alors c'est un nombre positif car il n'y a pas -0de système numérique ( 1000 is not -0au lieu de cela, il est positif 8)
  3. Si tous les bits le sont, 0c'est le cas 0.
  4. Sinon c'est un positive number.
Raghu
la source
-6

La réponse la plus simple:

1111 + 1 = (1) 0000. Donc 1111 doit être -1. Alors -1 + 1 = 0.

C'est parfait de tout comprendre pour moi.

Dmitry
la source
Cela ne fournit pas de réponse à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous son article.
Codor
C'est la réponse. Le plus simple. Pour moi - le meilleur.
Dmitry