Je suis un cours sur les systèmes informatiques et j’ai lutté contre, en partie, avec complément à deux . Je veux le comprendre, mais tout ce que j'ai lu ne m'a pas réuni l'image. J'ai lu le article de wikipedia et divers autres articles, y compris mon livre de texte .
Par conséquent, je voulais commencer cette wiki de la communauté pour définir ce qu'est le complément de Two, comment l'utiliser et comment il peut affecter les nombres lors d'opérations telles que les conversions (du signé au non signé et inversement), bit par bit opérations et opérations de transfert de bits.
Ce que j'espère, c'est une définition claire et concise facilement compréhensible par un programmeur.
Le complément à deux est un moyen astucieux de stocker des nombres entiers, de sorte que les problèmes mathématiques courants sont très simples à mettre en œuvre.
Pour comprendre, il faut penser aux nombres en binaire.
Il dit essentiellement,
Essayons-le avec un mini-octet de 4 bits (nous l'appellerons un nibble - 1/2 un octet).
0000
- zéro0001
- un0010
- deux0011
- trois0100
à 0111
- quatre à septC'est aussi loin que nous pouvons aller dans les points positifs. 23-1 = 7.
Pour les négatifs:
1111
- un négatif1110
- négatif deux1101
- négatif trois1100
à 1000
- négatif quatre à négatif huitNotez que vous obtenez une valeur supplémentaire pour les négatifs (1000
= -8), contrairement aux positifs. En effet, 0000
est utilisé pour zéro. Ceci peut être considéré comme Ligne numérique des ordinateurs.
Distinguer les nombres positifs des nombres 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 positives et négatives. Si le bit le plus significatif est 1
, alors le binaire peut être dit négatif, où comme si le bit le plus significatif (le plus à gauche) était 0
, vous pouvez dire que la valeur décimale est positive.
Les nombres négatifs du compliment renversent simplement le bit de signe, puis comptent à partir de 0. Mais cette approche doit traiter l'interprétation de 1000
en tant que «zéro négatif», ce qui prête à confusion. Vous n’avez généralement à vous en préoccuper que lorsque vous travaillez près du matériel.
Je me demande si cela pourrait être expliqué mieux 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 de stockage des entiers négatifs.
Considérons d’abord un entier non signé stocké sur 4 bits. Vous pouvez avoir le suivant
0000 = 0
0001 = 1
0010 = 2
...
1111 = 15
Celles-ci ne sont pas signées car rien n’indique qu’elles soient négatives ou positives.
Pour stocker des nombres négatifs, vous pouvez essayer un certain nombre de choses. Tout d'abord, vous pouvez utiliser la notation de magnitude de signe qui assigne le premier bit en tant que bit de signe pour représenter +/- et les bits restants pour représenter la grandeur. 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
Alors, 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 magnitude du signe seront très complexes.
Quel est
0010
1001 +
----
?
Un autre système est notation en excès . 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.
Alors vient le complément de deux. Vous pouvez maintenant stocker des nombres entiers positifs et négatifs et effectuer des calculs avec une relative facilité. Il existe un certain nombre de méthodes pour convertir un nombre en complément à deux. En voici un.
Convertissez le nombre en binaire (ignorez le signe pour le moment) 5 vaut 0101 et -5 vaut 0101
Si le nombre est positif, alors vous avez terminé . 5 est 0101 en binaire en utilisant la notation du complément à deux.
Si le nombre est négatif alors
3.1 trouver le complément (inverser les 0 et les 1) par exemple. -5 vaut 0101, donc trouver le complément est 1010
3.2 Ajouter 1 au complément 1010 + 1 = 1011 . Par conséquent, -5 en complément de deux est 1011.
Alors, si vous vouliez faire 2 + (-3) en binaire? 2 + (-3) est -1 . Que feriez-vous si vous utilisiez la magnitude de signe pour additionner ces nombres? 0010 + 1101 =?
En utilisant le complément à deux, songez à la facilité.
2 = 0010
-3 = 1101 +
-------------
-1 = 1111
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, ce qui donne 1.
Appliquez le signe = -1.
Tada!
Comme la plupart des explications que j'ai vues, celles ci-dessus expliquent clairement comment utiliser le complément à 2, mais n'expliquent pas vraiment ce qu'elles sont mathématiquement. Je vais essayer de le faire, du moins pour les nombres entiers, et je couvrirai un arrière-plan qui est probablement déjà familier.
Rappelez-vous comment cela fonctionne pour la décimale:
2345
est une façon d'écrire
2 × 103 + 3 × 102 + 4 × 101 + 5 × 10.
De la même manière, le binaire est une façon d'écrire des nombres en utilisant simplement 0 et 1 en suivant la même idée générale, mais en remplaçant les 10 précédents par 2. Puis en binaire,
1111
est une façon d'écrire
1 × 23 + 1 × 22 + 1 × 21 + 1 × 2
et si vous vous en sortez, cela équivaut à 15 (base 10). C'est parce que c'est
8 + 4 + 2 + 1 = 15.
C'est bien beau 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 est plus efficace d’utiliser un logiciel complément représentation 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 précédant un nombre positif normal. C'est gênant, parce que la question se pose: tous? Cela pourrait être un nombre infini de chiffres à prendre en compte.
Heureusement, les ordinateurs ne représentent pas l'infini. Les nombres sont limités à une longueur particulière (ou à une largeur si vous préférez). Revenons donc aux 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 × 27 + 0 × 26 + 0 × 25 + 0 × 24 + 1 × 23 + 1 × 22 + 1 × 21 + 1 × 2
Pour former le complément à 2 négatif, nous complétons d'abord tous les chiffres (binaires) pour former
11110000
et ajouter 1 à la forme
11110001
mais comment devons-nous comprendre que cela signifie -15?
La réponse est que nous changeons la signification du bit de poids fort (le bit le plus à gauche). Ce bit sera un 1 pour tous les nombres négatifs. Le changement consistera à changer le signe de sa contribution à la valeur du nombre dans lequel il apparaît. Nous entendons donc maintenant notre 11110001
-1 × 27 + 1 × 26 + 1 × 25 + 1 × 24 + 0 × 23 + 0 × 22 + 0 × 21 + 1 × 2
Notez que "-" devant cette expression? Cela signifie que le bit de signe porte le poids -27c'est -128 (base 10). Toutes les autres positions conservent le même poids qu’elles avaient en nombres binaires non signés.
Travailler notre -15, c'est
-128 + 64 + 32 + 16 + 1
Essayez-le sur votre calculatrice. c'est -15.
Parmi les trois principales façons dont j'ai vu les nombres négatifs représentés dans les ordinateurs, le complément de 2 gagne haut la main pour plus de commodité en utilisation générale. Il a une bizarrerie, cependant. Comme c'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 donne zéro. Il existe 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 à propos de ce nombre, c’est que si vous essayez de former son positif en le complétant et en en ajoutant un, vous obtenez le même nombre négatif. Cela semble naturel que zéro le fasse, mais c'est inattendu et pas du tout le comportement auquel nous sommes habitués, à part les ordinateurs, nous pensons généralement à un nombre illimité de chiffres, pas à cette arithmétique de longueur fixe.
Cela ressemble à la pointe de l'iceberg des bizarreries. Il y a plus d'attentes sous la surface, mais c'est suffisant pour cette discussion. Vous pourriez probablement en trouver plus si vous recherchez un "débordement" d'arithmétique en virgule fixe. Si vous voulez vraiment y entrer, vous pouvez également rechercher «l'arithmétique modulaire».
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 (je n'ai jamais vu personne le publier):
prenons un binaire, par exemple: 1101 qui est [en supposant que l'espace "1" est le signe] égal à -3 .
en utilisant le complément à 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 renverser et ajouter, vous pouvez simplement faire la méthode de base pour résoudre un binaire positif (disons 0101) est (23 * 0) + (22 * 1) + (21 * 0) + (2 * 1) = 5.
Faites exactement le même concept avec un négatif! (Avec une petite torsion)
prenez 1101, par exemple:
pour le premier numéro au lieu de 23 * 1 = 8 , do - (23 * 1) = -8 .
puis continuez comme d'habitude en faisant -8 + (22 * 1) + (21 * 0) + (2 * 1) = -3
Imaginez que vous ayez un nombre fini de bits/trits/chiffres/peu importe. Vous définissez 0 comme tous les chiffres étant 0 et vous comptez naturellement vers le haut:
00
01
02
..
Finalement, vous allez déborder.
98
99
00
Nous avons deux chiffres et pouvons représenter tous les nombres de 0 à 100. Tous ces chiffres sont positifs! Supposons que nous voulions 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, supposons qu'un nombre supérieur à 50 soit négatif. "0" à "49" représentent 0 à 49. "99" est -1, "98" est -2, ... "50" est -50.
Cette représentation est le complément de ten . Les ordinateurs utilisent généralement complément à deux , ce qui est la même sauf que l’utilisation des bits au lieu des chiffres.
La bonne chose à propos du complément de dix est que l'addition ne fonctionne que. Vous n'avez rien de spécial à ajouter pour ajouter des nombres positifs et négatifs!
Deux compléments sont trouvés en ajoutant un à un complément du nombre donné . Disons que nous devons trouver deux compléments de 10101
puis trouver son complément, c'est-à-dire, 01010
add 1
, c'est-à-dire , 01010+1=01011
, qui est la réponse finale.
Obtenons la réponse 10 - 12 sous forme binaire en utilisant 8 bits: Ce que nous allons vraiment faire est 10 + (-12)
Nous devons obtenir le complément de 12 pour le soustraire de 10. 12 en binaire est 00001100 . 10 en binaire est 00001010.
Pour obtenir le complément de 12, inversons simplement tous les bits, puis ajoutons 1 . 12 en binaire inversé correspond à 11110011. Il s'agit également du code inverse (complément) . Nous devons maintenant en ajouter un, maintenant 11110100.
Donc 11110100 est le compliment de 12! Facile quand on y pense de cette façon.
Vous pouvez maintenant résoudre la question ci-dessus de 10 à 12 sous forme binaire.
00001010
11110100
-----------------
11111110
En regardant le système de complément à deux du point de vue mathématique, cela a vraiment du sens. En complément de 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, en réalité, tout ce que nous faisons, c'est ajouter 100 de part et d'autre de l'équation.
Maintenant, l'équation est la suivante: 100 + 63 - 24 = x + 100, c'est pourquoi nous supprimons le 100 (ou 10 ou 1000 ou autre).
En raison de la situation peu pratique de devoir soustraire un nombre d'une longue chaîne de zéros, nous utilisons un système de «complément à radix réduit», dans le système décimal, le complément à neuf.
Quand on nous présente un nombre soustrait d'une grande chaîne de neuf, il suffit d'inverser les chiffres.
Exemple: 99999 - 03275 = 96724
C'est pourquoi, après le complément de neuf, nous ajoutons 1. Comme vous le savez probablement d'après les mathématiques de l'enfance, 9 devient 10 en "volant" 1. Donc, en gros, c'est simplement un complément de dix qui prend 1 dans la différence.
En binaire, le complément à deux équivaut au complément à dix, tandis que le complément à un 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 notre minuend est une chaîne de neuf décimales, notre minuend est une chaîne de uns en binaire.
Exemple: 111111 - 101001 = 010110
Parce que les chaînes de 1 sont inférieures à une puissance de Nice de deux, elles "volent" 1 la différence comme le font 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 premier, car nous venons de l'ajouter à la différence initiale.
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.
Jusqu'à présent, de nombreuses réponses expliquent bien pourquoi le complément à deux sert à représenter un nombre négatif, mais ne nous dit pas ce qu'est le nombre à deux, et surtout pas pourquoi un «1» est ajouté et, en fait, souvent mal interprété.
La confusion provient d'une mauvaise compréhension de la définition d'un nombre complémentaire. Un complément est la partie manquante qui rendrait quelque chose de complet.
Le complément à la base d'un nombre à n chiffres x dans la base b est, par définition, b ^ n-x. En binaire, 4 est représenté par 100, qui a 3 chiffres (n = 3) et une base de 2 (b = 2). Donc, son complément de base est b ^ n-x = 2 ^ 3-4 = 8-4 = 4 (ou 100 en binaire).
Cependant, en binaire, obtenir le complément à la base n'est pas aussi facile que d'obtenir son complément à base diminué, défini comme (b ^ n-1) -y, juste 1 de moins que celui du complément à base. Pour obtenir un complément de base diminué, il vous suffit d'inverser tous les chiffres.
100 -> 011 (complément de radix diminué)
pour obtenir le complément à la base (deux), nous ajoutons simplement 1, comme défini.
011 +1 -> 100 (complément à deux).
Maintenant, avec cette nouvelle compréhension, jetons un coup d'œil à 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 vous obtenez 0001 . Convertissez 0001 en décimale, qui est 1 . Appliquez le signe = -1 . Tada!
fin de Vincent * /
Devrait être compris comme
Le nombre commence par 1, donc c'est 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 à x: 1111-1 -> 1110; x = 0001, (retourner tous les chiffres)
appliquer le signe - et la réponse = -x = -1.
Compléments 2: Lorsque nous ajoutons un complément avec les compléments 1 d’un nombre, nous obtenons les compléments 2. Par exemple, le complément 1 de 100101 correspond à 011010 et celui de 2 à 011010 + 1 = 011011 (en ajoutant un complément à 1) Pour plus d'informations Cet article l'explique graphiquement.
C’est un moyen astucieux de coder des entiers négatifs de telle sorte qu’environ la moitié de la combinaison de bits d’un type de données soit réservée aux entiers négatifs, et que l’addition de la plupart des entiers négatifs avec leurs entiers positifs correspondants entraîne un report de dépassement. cela laisse le résultat à zéro binaire.
Ainsi, dans le complément à 2, si l'un est 0x0001, alors -1 est 0x1111, car cela entraînera une somme combinée de 0x0000 (avec un débordement de 1).
J'ai lu une explication fantastique sur Reddit de jng, en utilisant le compteur kilométrique comme analogie.
C'est une convention utile. Les mêmes circuits et opérations logiques que ajouter/soustraire des nombres positifs en binaire fonctionne toujours sur les deux positifs et des nombres négatifs si vous utilisez la convention, voilà pourquoi il en est ainsi utile et omniprésent.
Imaginez le compteur kilométrique d’une voiture qui tourne à (disons) 99999. Si vous incrémenter 00000 vous obtenez 00001. Si vous décrémentez 00000, vous obtenez 99999 (à cause du roulement). Si vous en ajoutez un à 99999, il retourne à 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, et ainsi de suite. Tu as arrêter quelque part, et aussi par convention, la moitié supérieure des chiffres sont considérés comme négatifs (50000-99999), et la moitié inférieure est positive il suffit de se tenir debout (00000-49999). En conséquence, le chiffre du haut être 5-9 signifie que le nombre représenté est négatif, et qu'il est 0-4 signifie que le nombre représenté est positif - exactement le même que le bit supérieur représentant le signe dans un nombre binaire complément à deux.
Comprendre cela était difficile pour moi aussi. Une fois, je l'ai eu et je suis retourné à relire les articles et les explications des livres (à l’époque, il n’existait pas d’Internet), il est apparu que beaucoup de ceux qui le décrivaient ne l’avaient pas vraiment le comprendre. J'ai écrit un livre enseignant la langue de l'Assemblée après ça (qui s'est assez bien vendu pendant 10 ans).
J'ai eu le même problème il y a quelques semaines. J'ai fini par lire à ce sujet en ligne à partir de différentes sources, en essayant de rassembler les morceaux et en écrivant moi-même juste pour m'assurer de bien comprendre. Nous utilisons le complément de deux principalement pour deux raisons:
Si vous souhaitez une explication plus détaillée de la question, essayez l’article écrit par moi ici . J'espère que ça aide!
J'ai aimé la réponse de Lavinio, mais le décalage des bits ajoute une certaine complexité. Il existe souvent un choix de bits mobiles tout en respectant le bit de signe ou en ne respectant pas le bit de signe. C'est le choix entre traiter les nombres comme signés (-8 à 7 pour un quartet, -128 à 127 pour les octets) ou aux nombres non signés de plage complète (0 à 15 pour les quartets, 0 à 255 pour les octets).
Le complément Word dérive de la complétude. Dans le monde décimal, les chiffres de 0 à 9 fournissent un complément (ensemble complet) de chiffres ou de symboles numériques exprimant tous les nombres décimaux. Dans le monde binaire, les chiffres 0 et 1 fournissent un complément de nombres 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 égal à zéro:
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 une utilisation efficace, les numéros de mémoire peuvent être stockés sous forme de représentations en 8 bits, 16 bits, 32 bits, 64 bits et 128 bits. Lorsqu'un nombre stocké sous forme de nombre à 8 bits est transféré dans un emplacement à 16 bits, le signe et la magnitude (valeur absolue) doivent rester identiques. Les représentations du complément 1 et du complément 2 facilitent cela. En tant que 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 signifie positif et 1 négatif. Le complément 2s ne signifie pas négatif . Cela signifie une quantité signée. Comme en décimal, la magnitude est représentée par la quantité positive. La structure utilise l'extension de signe pour conserver la quantité lors de la promotion dans un registre [] avec plus de bits:
[0101]=[00101]=[00000000000101]=5 (base 10)
[1011]=[11011]=[11111111111011]=-5(base 10)
En tant que verbe: complément à 2 signifie nier . Cela ne signifie pas faire négatif. Cela signifie que si négatif, rendre positif; Si positif, rendre 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 pour chaque chiffre à soustraire sa valeur de 1.
1'scomp(0101) = 1010.
Cela revient à retourner ou inverser chaque bit individuellement. Il en résulte un zéro négatif qui n’est pas très apprécié. Par conséquent, l’ajout d’un élément à son complément é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 des nombres étendus.
Ajouter:
1110 Carry 111110 Carry 0110 est identique à 000110 1111 111111 somme 0101 somme 000101
Soustraitant:
1110 Carry 00000 Carry
0110 is the same as 00110
-0111 +11001
---------- ----------
sum 0101 sum 11111
Notez que lorsque vous travaillez avec un complément à 2, l'espace vide à gauche du nombre est rempli de zéros pour les nombres positifs, mais est rempli de zéros pour les nombres positifs. Le report est toujours ajouté et doit être 1 ou 0.
À votre santé
Compléter bit à bit un nombre, c'est retourner tous les bits qu'il contient. Pour compléter le 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 inversement. Donc, en utilisant des exemples en nibbles, 0001
(1) devient 1111
(-1) et si vous appliquez à nouveau l'opération, vous retournez à 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. 0000
complète le 1111
, auquel on ajoute 1. déborde sur 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, ajouter 1 et -1 aux octets: 0001 + 1111
, les bits débordent du registre, laissant derrière 0000
.
Pour une introduction douce, le merveilleux Computerphile a produit une vidéo sur le sujet .
Référence: https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html
J'inverse tous les bits et 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;
Le complément à 2 est essentiellement une manière de trouver l'inverse additif d'un nombre binaire. Posez-vous la question suivante: à partir d’un nombre sous forme binaire, quel motif de bits, ajouté au nombre initial, rendrait le résultat égal à zéro? Si vous pouvez créer ce modèle de bits, celui-ci est la représentation -ve (inverse additif) du nombre d'origine; Par définition, ajouter un nombre à son inverse additif devrait toujours donner zéro. Exemple: prenez 101, qui est le nombre décimal 5. Maintenant, la tâche consiste à créer un modèle de bits qui, une fois ajouté au modèle de bits donné (101), donnerait zéro. Pour ce faire, commencez par le bit le plus à droite de 101 et posez à nouveau la même question pour chaque bit: quel bit dois-je ajouter au bit "this" pour que le résultat soit égal à zéro? Continuez à faire cela en tenant compte du report habituel. Une fois que nous avons terminé avec les 3 positions les plus à droite (les chiffres définissant le nombre initial sans tenir compte des zéros du début), le dernier report va dans la configuration de bits de l'inverse additif. De plus, étant donné que nous pourrions conserver le nombre original dans un seul octet, tous les autres bits principaux de l'inverse additif doivent également être des 1, de sorte que lorsque l'ordinateur ajoute le nombre et son inverse additif en utilisant "that" 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
Le complément de 2 d'un nombre donné est le non. obtenu en ajoutant 1 avec le complément à 1 du numéro . supposons que nous avons un numéro binaire: 10111001101 Son complément à 1 est: 01000110010 Et son complément à 2 sera: 01000110011