Article de reference

Complément à deux

Le complément à deux est la méthode la plus courante pour représenter les entiers signés (positifs, négatifs et nuls) sur les ordinateurs et, plus généralement, les valeurs bina...

Le complément à deux est la méthode la plus courante pour représenter les entiers signés (positifs, négatifs et nuls) sur les ordinateurs et, plus généralement, les valeurs binaires à virgule fixe . Le complément à deux utilise le chiffre binaire ayant la plus grande valeur comme signe pour indiquer si le nombre binaire est positif ou négatif ; lorsque le bit le plus significatif est 1 , le nombre est signé comme négatif et lorsque le bit le plus significatif est 0 , le nombre est signé comme positif. En conséquence, les nombres non négatifs sont représentés comme eux-mêmes : 6 est 0110, zéro est 0000 et -6 est 1010 (~6 + 1). Notez que bien que le nombre de bits binaires soit fixe tout au long d'un calcul, il est par ailleurs arbitraire.

Contrairement au schéma du complément à un , le schéma du complément à deux n'a qu'une seule représentation pour zéro. De plus, les implémentations arithmétiques peuvent être utilisées sur des entiers signés comme non signés et ne diffèrent que dans les situations de dépassement d'entier.

Procédure

Voici la procédure permettant d'obtenir le complément à deux d'un nombre négatif donné en chiffres binaires :

  • Étape 1 : en commençant par la représentation binaire absolue du nombre, le bit de tête étant un bit de signe ;
  • Étape 2 : inverser (ou retourner) tous les bits – en changeant chaque 0 en 1 et chaque 1 en 0 ;
  • Étape 3 : ajouter 1 au nombre entier inversé, en ignorant tout dépassement . La prise en compte du dépassement produira une valeur erronée pour le résultat.

Par exemple, pour calculer le nombre décimal −6 en binaire à partir du nombre 6 :

  • Étape 1 : +6 en décimal équivaut à 0110 en binaire ; le bit significatif le plus à gauche (le premier 0) est le signe (110 en binaire équivaut à -2 en décimal).
  • Étape 2 : inversez tous les bits de 0110 , ce qui donne 1001 .
  • Étape 3 : ajoutez la valeur de position 1 au nombre inversé 1001 , ce qui donne 1010 .

Pour vérifier que 1010 a bien une valeur de −6 , additionnez les valeurs de position, mais soustrayez la valeur du signe du calcul final. Étant donné que la valeur la plus significative est la valeur du signe, elle doit être soustraite pour produire le résultat correct : 1010 = ( 1 ×2 3 ) + ( 0 ×2 2 ) + ( 1 ×2 1 ) + ( 0 ×2 0 ) = 1 ×−8 + 0 + 1 ×2 + 0 = −6.

Notez que les étapes 2 et 3 constituent ensemble une méthode valide pour calculer l' inverse additif de tout entier (positif ou négatif) où l'entrée et la sortie sont au format complément à deux. Une alternative au calcul consiste à utiliser la soustraction . Voir ci-dessous pour la soustraction d'entiers au format complément à deux.

Théorie

Le complément à deux est un exemple de complément de base . Le « deux » dans le nom fait référence au terme qui, développé complètement dans un système N bits, est en fait « deux à la puissance N » - 2 N (le seul cas où exactement « deux » serait produit dans ce terme est N = 1 , donc pour un système à 1 bit, mais ceux-ci n'ont pas la capacité d'avoir à la fois un signe et un zéro), et c'est uniquement ce terme complet par rapport auquel le complément est calculé. En tant que tel, la définition précise du complément à deux d'un nombre N bits est le complément de ce nombre par rapport à 2 N .

La propriété déterminante d'être un complément d'un nombre par rapport à 2 N est simplement que la somme de ce nombre avec l'original produit 2 N. Par exemple, en utilisant le binaire avec des nombres jusqu'à trois bits (donc N = 3 et 2 N = 2 3 = 8 = 1000 2 , où ' 2 ' indique une représentation binaire), un complément à deux pour le nombre 3 ( 011 2 ) est 5 ( 101 2 ), car additionné à l'original il donne 2 3 = 1000 2 = 011 2 + 101 2 . Lorsque cette correspondance est utilisée pour représenter des nombres négatifs, elle revient en fait, par analogie avec les chiffres décimaux et un espace numérique n'autorisant que huit nombres non négatifs de 0 à 7, à diviser l'espace numérique en deux ensembles : les quatre premiers nombres 0 1 2 3 restent les mêmes, tandis que les quatre autres codent des nombres négatifs, en conservant leur ordre croissant, de sorte que 4 code -4, 5 code -3, 6 code -2 et 7 code -1. Une représentation binaire a cependant une utilité supplémentaire, car le bit le plus significatif indique également le groupe (et le signe) : il est 0 pour le premier groupe de nombres non négatifs et 1 pour le deuxième groupe de nombres négatifs. Les tableaux à droite illustrent cette propriété.

Le calcul du complément binaire à deux d'un nombre positif revient essentiellement à soustraire le nombre du 2 N . Mais comme on peut le voir pour l'exemple à trois bits et le 1000 2 ( 2 3 ) à quatre bits, le nombre 2 N ne sera pas lui-même représentable dans un système limité à N bits, car il se trouve juste en dehors de l' espace N bits (le nombre est néanmoins le point de référence du « complément à deux » dans un système N bits). De ce fait, les systèmes avec un maximum de N bits doivent décomposer la soustraction en deux opérations : d'abord soustraire du nombre maximum dans le système N bits, c'est- à-dire 2 N -1 (ce terme en binaire est en fait un nombre simple composé de « tous les 1 », et une soustraction de celui-ci peut être effectuée simplement en inversant tous les bits du nombre, également connu sous le nom d'opération NON au niveau du bit ), puis ajouter le un. Par coïncidence, ce nombre intermédiaire avant l'ajout de l'unité est également utilisé en informatique comme une autre méthode de représentation des nombres signés et est appelé complément à un (nommé ainsi parce que la somme d'un tel nombre avec l'original donne « tous les 1 »).

Comparé à d'autres systèmes de représentation de nombres signés ( par exemple, le complément à un ), le complément à deux présente l'avantage que les opérations arithmétiques fondamentales d' addition , de soustraction et de multiplication sont identiques à celles des nombres binaires non signés (à condition que les entrées soient représentées dans le même nombre de bits que la sortie et que tout dépassement au-delà de ces bits soit éliminé du résultat). Cette propriété rend le système plus simple à mettre en œuvre, en particulier pour une arithmétique de plus haute précision. De plus, contrairement aux systèmes de complément à un, le complément à deux n'a pas de représentation pour le zéro négatif et ne souffre donc pas des difficultés qui y sont associées. Sinon, les deux systèmes ont la propriété souhaitée selon laquelle le signe des entiers peut être inversé en prenant le complément de sa représentation binaire, mais le complément à deux a une exception - le négatif le plus bas, comme on peut le voir dans les tableaux.

Histoire

La méthode des compléments a longtemps été utilisée pour effectuer des soustractions dans les machines à additionner décimales et les calculatrices mécaniques . John von Neumann a suggéré l'utilisation de la représentation binaire en complément à deux dans son premier projet de rapport de 1945 sur la proposition de l'EDVAC pour un ordinateur numérique à programme enregistré électronique. L' EDSAC de 1949 , qui s'inspirait du premier projet , utilisait la représentation en complément à deux des entiers binaires négatifs.

De nombreux ordinateurs anciens, dont le CDC 6600 , le LINC , le PDP-1 et l'UNIVAC 1107, utilisaient la notation en complément à un ; les descendants de l'UNIVAC 1107, la série UNIVAC 1100/2200 , ont continué à le faire. Les machines scientifiques de la série IBM 700/7000 utilisent la notation signe/magnitude, à l'exception des registres d'index qui sont en complément à deux. Les premiers ordinateurs commerciaux stockant des valeurs négatives sous forme de complément à deux incluent l' English Electric DEUCE (1955) et les Digital Equipment Corporation PDP-5 (1963) et PDP-6 (1964). Le System/360 , introduit en 1964 par IBM , alors l'acteur dominant de l'industrie informatique, a fait du complément à deux la représentation binaire la plus largement utilisée dans l'industrie informatique. Le premier mini-ordinateur, le PDP-8 introduit en 1965, utilise l'arithmétique en complément à deux, tout comme le Data General Nova de 1969 , le PDP-11 de 1970 et presque tous les mini-ordinateurs et micro-ordinateurs ultérieurs.

Conversion à partir d'une représentation en complément à deux

Un système de numération en complément à deux encode les nombres positifs et négatifs dans une représentation numérique binaire. Le poids de chaque bit est une puissance de deux, à l'exception du bit le plus significatif , dont le poids est l'inverse de la puissance de deux correspondante.

La valeur w d'un entier N bits est donnée par la formule suivante :

Le bit le plus significatif détermine le signe du nombre et est parfois appelé bit de signe . Contrairement à la représentation par signe et grandeur , le bit de signe a également le poids −(2 N  − 1 ) indiqué ci-dessus. En utilisant N bits, tous les entiers de −(2 N  − 1 ) à 2 N  − 1 − 1 peuvent être représentés.

Conversion en représentation en complément à deux

En notation en complément à deux, un nombre non négatif est représenté par sa représentation binaire ordinaire ; dans ce cas, le bit le plus significatif est 0. Cependant, la plage de nombres représentés n'est pas la même que pour les nombres binaires non signés. Par exemple, un nombre non signé de 8 bits peut représenter les valeurs de 0 à 255 (11111111). Cependant, un nombre de 8 bits en complément à deux ne peut représenter que des entiers non négatifs de 0 à 127 (01111111), car le reste des combinaisons de bits avec le bit le plus significatif comme « 1 » représente les entiers négatifs de −1 à −128.

L'opération de complément à deux est l' opération inverse additive , donc les nombres négatifs sont représentés par le complément à deux de la valeur absolue .

Du complément à un

Pour obtenir le complément à deux d'un nombre binaire négatif, tous les bits sont inversés, ou « retournés », en utilisant l' opération NOT au niveau du bit ; la valeur de 1 est ensuite ajoutée à la valeur résultante, en ignorant le débordement qui se produit lors de la prise du complément à deux de 0.

Par exemple, en utilisant 1 octet (= 8 bits), le nombre décimal 5 est représenté par

0000 0101 2

Le bit le plus significatif (le bit le plus à gauche dans ce cas) est 0, donc le motif représente une valeur non négative. Pour convertir en −5 en notation en complément à deux, tout d'abord, tous les bits sont inversés, c'est-à-dire : 0 devient 1 et 1 devient 0 :

1111 1010 2

À ce stade, la représentation est le complément à un de la valeur décimale −5. Pour obtenir le complément à deux, on ajoute 1 au résultat, ce qui donne :

1111 1011 2

Le résultat est un nombre binaire signé représentant la valeur décimale −5 sous forme de complément à deux. Le bit le plus significatif est 1, la valeur représentée est donc négative.

Le complément à deux d'un nombre négatif est la valeur positive correspondante, sauf dans le cas particulier du nombre le plus négatif . Par exemple, l'inversion des bits de −5 (ci-dessus) donne :

0000 0100 2

Et en ajoutant un, on obtient la valeur finale :

0000 0101 2

De même, le complément à deux de zéro est nul : l'inversion donne tous les uns, et l'ajout d'un transforme les uns en zéros (puisque le débordement est ignoré).

Le complément à deux du nombre le plus négatif représentable (par exemple un 1 comme bit le plus significatif et tous les autres bits à zéro) est lui-même. Il existe donc un nombre négatif « supplémentaire » pour lequel le complément à deux ne donne pas la négation, voir § Nombre le plus négatif ci-dessous.

Soustraction de 2N

La somme d'un nombre et de son complément à un est un mot de N bits dont tous les bits sont à 1, ce qui donne (en le lisant comme un nombre binaire non signé) 2 N − 1 . Ensuite, l'ajout d'un nombre à son complément à deux donne comme résultat les N bits les plus bas mis à 0 et le bit de retenue à 1, ce dernier ayant le poids (en le lisant comme un nombre binaire non signé) de 2 N . Par conséquent, dans l'arithmétique binaire non signée, la valeur du nombre négatif à complément à deux x * d'un x positif satisfait l'égalité x * = 2 Nx .

Par exemple, pour trouver la représentation à quatre bits de −5 (les indices désignent la base de la représentation ) :

x = 5 10 donc x = 0101 2

Ainsi, avec N = 4 :

x * = 2 Nx = 2 4 − 5 10 = 16 10 - 5 10 = 10000 2 − 0101 2 = 1011 2

Le calcul peut être effectué entièrement en base 10, en convertissant en base 2 à la fin :

x * = 2 Nx = 2 4 − 5 10 = 11 10 = 1011 2

Travailler du LSB vers le MSB

Un raccourci pour convertir manuellement un nombre binaire en complément à deux consiste à commencer par le bit le moins significatif (LSB) et à copier tous les zéros, en partant du bit le moins significatif (LSB) vers le bit le plus significatif (MSB) jusqu'à atteindre le premier 1 ; puis à copier ce 1 et à inverser tous les bits restants (laissez le MSB à 1 si le nombre initial était en représentation signe et grandeur). Ce raccourci permet à une personne de convertir un nombre en complément à deux sans d'abord former son complément à un. Par exemple : dans la représentation en complément à deux, la négation de « 0011 1100 » est « 1100 0 100 », où les chiffres soulignés n'ont pas été modifiés par l'opération de copie (tandis que le reste des chiffres a été inversé).

Dans les circuits informatiques, cette méthode n'est pas plus rapide que la méthode « complément et addition d'un » ; les deux méthodes nécessitent de travailler séquentiellement de droite à gauche, en propageant les changements logiques. La méthode de complément et d'addition d'un peut être accélérée par un circuit additionneur à report standard ; la méthode LSB vers MSB peut être accélérée par une transformation logique similaire.

Extension de panneau

Lors de la conversion d'un nombre à complément à deux avec un certain nombre de bits en un nombre avec plus de bits (par exemple, lors de la copie d'une variable d'un octet vers une variable de deux octets), le bit le plus significatif doit être répété dans tous les bits supplémentaires. Certains processeurs le font en une seule instruction ; sur d'autres processeurs, une condition doit être utilisée suivie d'un code pour définir les bits ou octets concernés.

De même, lorsqu'un nombre est décalé vers la droite, le bit le plus significatif, qui contient les informations de signe, doit être conservé. Cependant, lorsqu'il est décalé vers la gauche, un bit est décalé vers l'extérieur. Ces règles préservent la sémantique courante selon laquelle les décalages vers la gauche multiplient le nombre par deux et les décalages vers la droite le divisent par deux. Cependant, si le bit le plus significatif passe de 0 à 1 (et vice versa), on dit qu'un débordement se produit dans le cas où la valeur représente un entier signé.

Le décalage et le doublement de la précision sont tous deux importants pour certains algorithmes de multiplication. Notez que contrairement à l'addition et à la soustraction, l'extension de largeur et le décalage vers la droite sont effectués différemment pour les nombres signés et non signés.

Nombre le plus négatif

À une seule exception près, à partir de n'importe quel nombre en représentation en complément à deux, si tous les bits sont inversés et 1 ajouté, on obtient la représentation en complément à deux du négatif de ce nombre. Plus 12 devient moins 12, plus 5 devient moins 5, zéro devient zéro (+dépassement), etc.

Prendre le complément à deux (négation) du nombre minimum de la plage n'aura pas l'effet souhaité de nier le nombre. Par exemple, le complément à deux de −128 dans un système à huit bits est −128, comme indiqué dans le tableau de droite. Bien que le résultat attendu de la négation de −128 soit +128, il n'existe aucune représentation de +128 avec un système à complément à deux à huit bits et il est donc en fait impossible de représenter la négation. Notez que le complément à deux étant le même nombre est détecté comme une condition de dépassement de capacité car il y a eu un report vers mais pas vers la sortie du bit le plus significatif.

Le fait qu'un nombre non nul soit égal à sa propre négation est imposé par le fait que zéro est sa propre négation et que le nombre total de nombres est pair. Preuve : il existe 2^n - 1 nombres non nuls (un nombre impair). La négation partitionnerait les nombres non nuls en ensembles de taille 2, mais cela aurait pour résultat que l'ensemble des nombres non nuls aurait une cardinalité paire. Ainsi, au moins un des ensembles a une taille 1, c'est-à-dire qu'un nombre non nul est sa propre négation.

La présence du nombre le plus négatif peut conduire à des bugs de programmation inattendus où le résultat a un signe inattendu, ou conduit à une exception de dépassement inattendue, ou conduit à des comportements complètement étranges. Par exemple,

  • l'opérateur de négation unaire ne peut pas changer le signe d'un nombre différent de zéro. par exemple, −(−128) ⟼ −128 (où « » se lit comme « devient »).
  • une implémentation de valeur absolue peut renvoyer un nombre négatif ; par exemple, abs(−128) ⟼ −128 .
  • De même, la multiplication par −1 peut ne pas fonctionner comme prévu ; par exemple, (−128) × (−1) ⟼ −128.
  • La division par −1 peut provoquer une exception (comme celle provoquée par la division par 0 ) ; même le calcul du reste (ou modulo ) par −1 peut déclencher cette exception ; par exemple, (−128) ÷ (−1) ⟼ [ CRASH ] , (−128) % (−1) ⟼ [ CRASH ] .

Dans les langages de programmation C et C++ , les comportements ci-dessus ne sont pas définis et non seulement ils peuvent renvoyer des résultats étranges, mais le compilateur est libre de supposer que le programmeur a assuré que les opérations numériques indéfinies ne se produisent jamais et de tirer des conclusions à partir de cette hypothèse. Cela permet un certain nombre d'optimisations, mais conduit également à un certain nombre de bugs étranges dans les programmes avec ces calculs indéfinis.

Ce nombre le plus négatif en complément à deux est parfois appelé « le nombre étrange » , car il est la seule exception. Bien que ce nombre soit une exception, il est un nombre valide dans les systèmes de complément à deux classiques. Toutes les opérations arithmétiques fonctionnent avec lui à la fois comme opérande et (à moins qu'il n'y ait eu un débordement) comme résultat.

Pourquoi ça marche

Étant donné un ensemble de toutes les valeurs N bits possibles, nous pouvons attribuer à la moitié inférieure (par la valeur binaire) les entiers de 0 à (2 N  − 1 − 1) inclus et à la moitié supérieure les entiers de −2 N  − 1 à −1 inclus. La moitié supérieure (encore une fois, par la valeur binaire) peut être utilisée pour représenter les entiers négatifs de −2 N  − 1 à −1 car, sous l'addition modulo 2 N, ils se comportent de la même manière que ces entiers négatifs. C'est-à-dire que, comme i + j mod 2 N = i + ( j + 2 N ) mod 2 N , toute valeur dans l'ensemble {  j + k  2 N | k est un entier }  peut être utilisée à la place de j .

Par exemple, avec huit bits, les octets non signés sont compris entre 0 et 255. En soustrayant 256 de la moitié supérieure (128 à 255), on obtient les octets signés −128 à −1.

La relation avec le complément à deux est réalisée en notant que 256 = 255 + 1 , et (255 − x ) est le complément à un de x .

Exemple

Dans cette sous-section, les nombres décimaux sont suivis d'un point décimal « . »

Par exemple, un nombre de 8 bits ne peut représenter que tous les entiers de −128. à 127., inclus, puisque (2 8 − 1 = 128.) . −95. modulo 256. est équivalent à 161. puisque

−95. + 256.
= −95. + 255. + 1
= 255. − 95. + 1
= 160. + 1.
= 161.
 1111 1111 255. − 0101 1111 − 95. ============= ===== 1010 0000 (complément à un) 160. + 1 + 1 ============= ===== 1010 0001 (complément à deux) 161. 

Fondamentalement, le système représente les entiers négatifs en comptant à rebours et en enroulant autour de . La limite entre les nombres positifs et négatifs est arbitraire, mais par convention, tous les nombres négatifs ont un bit le plus à gauche ( bit le plus significatif ) de un. Par conséquent, le nombre à quatre bits le plus positif est 0111 (7.) et le plus négatif est 1000 (−8.). En raison de l'utilisation du bit le plus à gauche comme bit de signe, la valeur absolue du nombre le plus négatif (|−8.| = 8.) est trop grande pour être représentée. La négation d'un nombre en complément à deux est simple : inversez tous les bits et ajoutez un au résultat. Par exemple, en néant 1111, nous obtenons 0000 + 1 = 1. Par conséquent, 1111 en binaire doit représenter −1 en décimal.

Le système est utile pour simplifier la mise en œuvre de l'arithmétique sur le matériel informatique. L'addition de 0011 (3.) à 1111 (−1.) semble à première vue donner la réponse incorrecte de 10010. Cependant, le matériel peut simplement ignorer le bit le plus à gauche pour donner la réponse correcte de 0010 (2.). Des contrôles de dépassement doivent toujours exister pour détecter des opérations telles que la somme de 0100 et 0100.

Le système permet donc d'additionner des opérandes négatifs sans circuit de soustraction ou circuit détectant le signe d'un nombre. De plus, ce circuit d'addition peut également effectuer une soustraction en prenant le complément à deux d'un nombre (voir ci-dessous), ce qui ne nécessite qu'un cycle supplémentaire ou son propre circuit additionneur. Pour ce faire, le circuit fonctionne simplement comme s'il y avait un bit supplémentaire à l'extrême gauche de 1.

Opérations arithmétiques

Ajout

L'addition de nombres en complément à deux ne nécessite aucun traitement particulier, même si les opérandes ont des signes opposés ; le signe du résultat est déterminé automatiquement. Par exemple, additionner 15 et −5 :

 0000 1111 (15) + 1111 1011 (−5) ============= 0000 1010 (10) 

Ou le calcul de 5 − 15 = 5 + (−15) :

 0000 0101 ( 5) + 1111 0001 (−15) ============= 1111 0110 (−10) 

Ce processus repose sur une restriction à 8 bits de précision ; un report jusqu'au 9e bit le plus significatif (inexistant) est ignoré, ce qui donne le résultat arithmétiquement correct de 10 10 .

Les deux derniers bits de la ligne de retenue (lecture de droite à gauche) contiennent des informations vitales : si le calcul a abouti à un dépassement arithmétique , un nombre trop grand pour être représenté par le système binaire (dans ce cas supérieur à 8 bits). Une condition de dépassement existe lorsque ces deux derniers bits sont différents l'un de l'autre. Comme mentionné ci-dessus, le signe du nombre est codé dans le MSB du résultat.

En d'autres termes, si les deux bits de retenue de gauche (ceux situés à l'extrême gauche de la rangée supérieure dans ces exemples) sont tous les deux des 1 ou des 0, le résultat est valide ; si les deux bits de retenue de gauche sont « 1 0 » ou « 0 1 », un dépassement de signe s'est produit. De manière pratique, une opération XOR sur ces deux bits peut rapidement déterminer si une condition de dépassement existe. À titre d'exemple, considérons l'addition signée de 4 bits de 7 et 3 :

 0111 (transporter) 0111 (7) + 0011 (3) ====== 1010 (−6) invalide ! 

Dans ce cas, les deux bits de retenue les plus à gauche (MSB) sont « 01 », ce qui signifie qu'il y a eu un dépassement de capacité d'addition en complément à deux. Autrement dit, 1010 2 = 10 10 est en dehors de la plage autorisée de −8 à 7. Le résultat serait correct s'il était traité comme un entier non signé.

En général, deux nombres N bits quelconques peuvent être additionnés sans débordement, en étendant d'abord le signe de chacun d'eux à N  + 1 bits, puis en les additionnant comme ci-dessus. Le résultat N  + 1 bits est suffisamment grand pour représenter n'importe quelle somme possible ( le complément à deux de N = 5 peut représenter des valeurs comprises entre −16 et 15), de sorte qu'aucun débordement ne se produira. Il est alors possible, si on le souhaite, de « tronquer » le résultat à N bits tout en préservant la valeur si et seulement si le bit rejeté est une extension de signe appropriée des bits de résultat conservés. Cela fournit une autre méthode de détection de débordement, qui est équivalente à la méthode de comparaison des bits de retenue, mais qui peut être plus facile à mettre en œuvre dans certaines situations, car elle ne nécessite pas d'accéder aux éléments internes de l'addition.

Soustraction

Les ordinateurs utilisent généralement la méthode des compléments pour implémenter la soustraction. L'utilisation de compléments pour la soustraction est étroitement liée à l'utilisation de compléments pour représenter des nombres négatifs, car la combinaison autorise tous les signes d'opérandes et de résultats ; la soustraction directe fonctionne également avec les nombres en complément à deux. Comme pour l'addition, l'avantage de l'utilisation du complément à deux est qu'il n'est pas nécessaire d'examiner les signes des opérandes pour déterminer si l'addition ou la soustraction est nécessaire. Par exemple, soustraire −5 de 15 revient en réalité à ajouter 5 à 15, mais cela est masqué par la représentation en complément à deux :

 11110 000 (emprunter) 0000 1111 (15) − 1111 1011 (−5) ============= 0001 0100 (20) 

Le débordement est détecté de la même manière que pour l'addition, en examinant les deux bits les plus à gauche (les plus significatifs) des emprunts ; un débordement s'est produit s'ils sont différents.

Un autre exemple est une opération de soustraction où le résultat est négatif : 15 − 35 = −20 :

 11100 000 (emprunter) 0000 1111 (15) − 0010 0011 (35) ============= 1110 1100 (−20) 

Comme pour l'addition, le débordement dans la soustraction peut être évité (ou détecté après l'opération) en étendant d'abord le signe des deux entrées d'un bit supplémentaire.

Multiplication

Le produit de deux nombres N bits nécessite 2 N bits pour contenir toutes les valeurs possibles.

Si la précision des deux opérandes utilisant le complément à deux est doublée avant la multiplication, la multiplication directe (en éliminant les bits en excès au-delà de cette précision) fournira le résultat correct. Par exemple, prenons 6 × (−5) = −30 . Tout d'abord, la précision est étendue de quatre bits à huit. Ensuite, les nombres sont multipliés, en éliminant les bits au-delà du huitième bit (comme indiqué par « x ») :

 00000110 (6) * 11111011 (−5) ============ 110 1100 00000 110000 1100000 11000000 x10000000 + xx00000000 ============ xx11100010 

C'est très inefficace ; en doublant la précision à l'avance, toutes les additions doivent être en double précision et il faut au moins deux fois plus de produits partiels que pour les algorithmes plus efficaces réellement implémentés dans les ordinateurs. Certains algorithmes de multiplication sont conçus pour le complément à deux, notamment l'algorithme de multiplication de Booth . Les méthodes de multiplication des nombres de signe-magnitude ne fonctionnent pas avec les nombres en complément à deux sans adaptation. Il n'y a généralement pas de problème lorsque le multiplicande (celui qui est ajouté de manière répétée pour former le produit) est négatif ; le problème est de définir correctement les bits initiaux du produit lorsque le multiplicateur est négatif. Deux méthodes d'adaptation des algorithmes pour gérer les nombres en complément à deux sont courantes :

  • Vérifiez d'abord si le multiplicateur est négatif. Si c'est le cas, inversez ( c'est-à-dire prenez le complément à deux) les deux opérandes avant de multiplier. Le multiplicateur sera alors positif et l'algorithme fonctionnera. Comme les deux opérandes sont inversés, le résultat aura toujours le signe correct.
  • Soustraire le produit partiel résultant du MSB (pseudo-signe bit) au lieu de l'ajouter comme les autres produits partiels. Cette méthode nécessite que le bit de signe du multiplicande soit étendu d'une position, en étant préservé pendant les actions de décalage vers la droite.

Comme exemple de la deuxième méthode, prenons l'algorithme commun d'addition et de décalage pour la multiplication. Au lieu de décaler les produits partiels vers la gauche comme on le fait avec un crayon et du papier, le produit accumulé est décalé vers la droite, dans un deuxième registre qui contiendra finalement la moitié la moins significative du produit. Étant donné que les bits les moins significatifs ne sont pas modifiés une fois qu'ils sont calculés, les additions peuvent être en simple précision, s'accumulant dans le registre qui contiendra finalement la moitié la plus significative du produit. Dans l'exemple suivant, en multipliant à nouveau 6 par −5, les deux registres et le bit de signe étendu sont séparés par « | » :

 0 0110 (6) (multiplicande avec bit de signe étendu) × 1011 (−5) (multiplicateur) =|======|==== 0|0110|0000 (premier produit partiel (le bit le plus à droite est 1)) 0|0011|0000 (décalage vers la droite, en préservant le bit de signe étendu) 0|1001|0000 (ajouter le deuxième produit partiel (le bit suivant est 1)) 0|0100|1000 (décalage vers la droite, en préservant le bit de signe étendu) 0|0100|1000 (ajouter le troisième produit partiel : 0 donc aucun changement) 0|0010|0100 (décalage vers la droite, en préservant le bit de signe étendu) 1|1100|0100 (soustraire le dernier produit partiel puisqu'il provient du bit de signe) 1|1110|0010 (décalage vers la droite, en préservant le bit de signe étendu) |1110|0010 (ignorer le bit de signe étendu, donnant la réponse finale, −30) 

Comparaison (commande)

La comparaison est souvent implémentée avec une soustraction factice, où les indicateurs du registre d'état de l'ordinateur sont vérifiés, mais le résultat principal est ignoré. L' indicateur zéro indique si deux valeurs comparées sont égales. Si le OU exclusif des indicateurs de signe et de dépassement est 1, le résultat de la soustraction était inférieur à zéro, sinon le résultat était nul ou supérieur. Ces vérifications sont souvent implémentées dans les ordinateurs dans des instructions de branchement conditionnel .

Les nombres binaires non signés peuvent être ordonnés par un ordre lexicographique simple , où la valeur du bit 0 est définie comme inférieure à la valeur du bit 1. Pour les valeurs de complément à deux, la signification du bit le plus significatif est inversée (c'est-à-dire que 1 est inférieur à 0).

L'algorithme suivant (pour une architecture en complément à deux sur n bits) définit le registre de résultats R sur −1 si A < B, sur +1 si A > B et sur 0 si A et B sont égaux :

// comparaison inversée du bit de signe
si A ( n - 1 ) == 0 et B ( n - 1 ) == 1 alors renvoyer + 1 sinon si A ( n - 1 ) == 1 et B ( n - 1 ) == 0 alors renvoyer - 1 fin // comparaison des bits restants
pour i = n - 2 ... 0 faire si A ( i ) == 0 et B ( i ) == 1 alors renvoyer - 1 sinon si A ( i ) == 1 et B ( i ) == 0 alors renvoyer + 1 fin fin renvoyer 0

Complément à deux et nombres 2-adiques

Dans un HAKMEM classique publié par le MIT AI Lab en 1972, Bill Gosper a noté que le fait que la représentation interne d'une machine soit ou non en complément à deux pouvait être déterminé en additionnant les puissances successives de deux. Dans un élan d'imagination, il a noté que le résultat de cette opération algébrique indiquait que « l'algèbre est exécutée sur une machine (l'univers) qui est en complément à deux ».

La conclusion finale de Gosper n'est pas nécessairement destinée à être prise au sérieux, et elle s'apparente à une plaisanterie mathématique . L'étape critique est "...110 = ...111 − 1", c'est-à-dire "2 X = X − 1", et donc X = ...111 = −1. Cela présuppose une méthode par laquelle une chaîne infinie de 1 est considérée comme un nombre, ce qui nécessite une extension des concepts de valeur de position finie en arithmétique élémentaire. Elle est significative soit comme partie d'une notation en complément à deux pour tous les entiers, comme nombre 2-adique typique , ou même comme l'une des sommes généralisées définies pour la série divergente de nombres réels 1 + 2 + 4 + 8 + ··· . Les circuits arithmétiques numériques, idéalisés pour fonctionner avec des chaînes de bits infinies (s'étendant aux puissances positives de 2), produisent une addition et une multiplication 2-adiques compatibles avec la représentation en complément à deux. La continuité des opérations arithmétiques binaires et des opérations binaires dans la métrique 2-adique a également une certaine utilité en cryptographie.

Conversion de fractions

Pour convertir un nombre avec une partie fractionnaire, comme .0101, il faut convertir de droite à gauche les 1 en décimal comme dans une conversion normale. Dans cet exemple 0101 est égal à 5 ​​en décimal. Chaque chiffre après la virgule flottante représente une fraction dont le dénominateur est un multiplicateur de 2. Ainsi, le premier est 1/2, le deuxième est 1/4 et ainsi de suite. Ayant déjà calculé la valeur décimale comme mentionné ci-dessus, seul le dénominateur du LSB (LSB = en commençant par la droite) est utilisé. Le résultat final de cette conversion est 5/16.

Par exemple, si l'on a pour valeur flottante 0,0110 pour que cette méthode fonctionne, il ne faut pas prendre en compte le dernier 0 à partir de la droite. Ainsi, au lieu de calculer la valeur décimale de 0110, on calcule la valeur 011, qui est 3 en décimal (en laissant le 0 à la fin, le résultat aurait été 6, avec le dénominateur 2 4 = 16, ce qui se réduit à 3/8). Le dénominateur est 8, ce qui donne un résultat final de 3/8.

Plus d articles de Worldlex Wiki

Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.

Explorer l index