Dans le système de numération décimal, les nombres négatifs sont précédés d’un signe moins. En électronique numérique, les seuls symboles que nous savons représenter avec deux niveaux de tension sont les bits 0 et 1. Le signe moins est un symbole supplémentaire pour lequel nous n’avons pas de représentation électrique directe. Dans cette section, nous allons expliquer comment il est possible de s’en passer.
Dans la section précédente, nous avons exposé la technique de soustraction en binaire. Nous l’avons limitée au cas où les opérandes et le résultat étaient des nombres positifs.
Que se passe-t-il lorsque le second opérande est plus grand que le premier ? Calculons, par exemple, la différence . Les opérandes ont été représentés sur huit bits.
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
– | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | |
-1 | -1 | -1 | -1 | -1 | -1 | ||||
= | … | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 |
À partir du sixième bit en partant de la droite, le calcul produit une séquence infinie de 1 associée à une séquence infinie de retenues. Pour écrire le résultat, il faudrait un nombre infini de bits.
En pratique, les ordinateurs travaillent sur des données de taille fixe. Cela signifie que le résultat d’une opération est tronqué de manière à tenir sur un nombre prédéfini d’octets. Ici, par exemple, nous retiendrons la valeur comme résultat de la soustraction.
S’agit-il d’un bonne représentation du nombre ? Pour le vérifier, calculons le résultat de l’addition en binaire :
+1 | +1 | +1 | +1 | +1 | +1 | ||||
0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | ||
+ | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | |
= | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
L’addition produit une retenue au neuvième bit, mais si nous tronquons le résultat sur huit bits, nous obtenons bien . Nous pouvons en conclure que peut être utilisé comme une représentation du nombre sur huit bits.
Le raisonnement présenté ci-dessus permet d’obtenir une représentation des nombres négatifs utilisable dans les opérations arithmétiques courantes, sans utiliser d’autre symbole que les bits 0 et 1. Elle est appelée représentation en complément à deux.
À présent, la même représentation binaire peut correspondre à deux nombres différents.
Par exemple, l’octet peut représenter aussi bien le nombre 236 que le nombre -20. Pour résoudre cette ambiguïté, en complément à deux, on adopte la convention suivante :
Le bit de poids fort est également nommé « bit de signe ».
Le tableau ci-dessous donne un aperçu des valeurs qui peuvent être représentées sur huit bits en binaire pur et en complément à deux :
Décimal | Binaire pur | Complément à deux |
---|---|---|
255 | ||
254 | ||
253 | ||
⋮ | ⋮ | |
129 | ||
128 | ||
127 | ||
126 | ||
125 | ||
⋮ | ⋮ | ⋮ |
2 | ||
1 | ||
0 | ||
-1 | ||
-2 | ||
⋮ | ⋮ | |
-126 | ||
-127 | ||
-128 |
En complément à deux sur huit bits, il est possible de représenter les nombres entiers de (-128) à (127). Dans le cas général, sur bits, il est possible de représenter les entiers de à .
Nous proposons ci-dessous plusieurs techniques pour déterminer rapidement la représentation binaire de l’opposé d’un nombre.
Pour obtenir la représentation binaire de l’opposé d’un nombre, le complément à deux se calcule en deux temps :
Nombre original~: | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | |
+1 | +1 | ||||||||
Complément à un~: | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | |
+ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | |
Complément à deux~: | = | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 |
Comparons les représentations binaires des nombres et obtenues précédemment.
0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 |
1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 |
Nous observons que les trois bits de poids faibles sont identiques tandis que les cinq autres sont inversés. Voici une recette rapide pour déterminer l’opposé d’un nombre représenté en binaire :
En utilisant cette technique, nous montrons ci-dessous comment calculer la représentation binaire du nombre -80 :
0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 |
Comme nous l’avons indiqué plus haut, le bit de poids fort de la représentation en complément à deux est souvent appelé « bit de signe ». Si nous reprenons le tableau des valeurs binaires sur huit bits, nous observons que la valeur -128 est représentée par l’octet . Nous pouvons ainsi considérer que le bit de poids fort d’un octet en complément à deux a un poids égal à -128.
Par exemple, l’octet représentant la valeur -20 se décomposerait de la manière suivante :
-128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
---|---|---|---|---|---|---|---|
1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 |
En effet :
Dans le cas général, le bit de poids fort d’un nombre représenté en complément à deux sur bits aura pour poids .
Dans un ordinateur, les opérations arithmétiques s’effectuent sur un nombre de bits prédéfini. Lorsque le résultat d’une addition est représenté sur le même nombre de bits que les opérandes, des problèmes peuvent se présenter. Par exemple, imaginons que nous souhaitions additionner les nombres 83 et 52. Les opérandes et la somme seront représentés sur huit bits en complément à deux.
+1 | +1 | +1 | ||||||
0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | |
+ | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 |
= | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
Puisque nous avons additionné deux nombres positifs, nous attendions un résultat positifs. Cependant, en complément à deux sur huit bits, le bit de signe du résultat ci-dessus indique qu’il représente un nombre négatif !
Cette situation s’explique ainsi : le plus grand nombre représentable en complément à deux sur huit bits est 127, or . Pour représenter cette valeur avec le bit de signe approprié, un bit de plus aurait été nécessaire.
Dans le cas général, on parle de débordement lorsque le bit de signe du résultat d’une opération d’addition ou de soustraction n’est pas cohérent avec les bits de signe des opérandes, c’est-à-dire dans les quatre cas suivants :
Il ne faut pas confondre les notions de débordement et de retenue. Dans l’exemple ci-dessus, , calculé en complément à deux sur huit bits, déborde mais ne produit pas de retenue.
Le complément à deux est une convention pour représenter les nombres relatifs en binaire.
Un groupe de bits peut représenter les valeurs comprises entre et .
Les opérations d’addition, de soustraction et de multiplication en complément à deux suivent les mêmes règles qu’en binaire pur.
En complément à deux, un nombre positif a son bit de poids fort à 0, un nombre négatif a son bit de poids fort à 1.
Le bit de poids fort est également nommé « bit de signe ». On peut lui associer un poids égal à .
On parle de débordement lorsque le bit de signe du résultat d’une opération d’addition ou de soustraction n’est pas cohérent avec les bits de signe des opérandes.