Représentation des nombres négatifs

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.

Lorsqu’une soustraction produit un résultat négatif

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 0200 - 20. 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 1110 1100bin1110\ 1100_{bin} comme résultat de la soustraction.

S’agit-il d’un bonne représentation du nombre 20-20 ? Pour le vérifier, calculons le résultat de l’addition 20+(20)20 + (-20) 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 0000 0000bin0000\ 0000_{bin}. Nous pouvons en conclure que 1110 1100bin1110\ 1100_{bin} peut être utilisé comme une représentation du nombre 20-20 sur huit bits.

La représentation des nombres en complément à deux

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 1110 1100bin1110\ 1100_{bin} 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 1111 1111bin1111\ 1111_{bin}
254 1111 1110bin1111\ 1110_{bin}
253 1111 1101bin1111\ 1101_{bin}
129 1000 0001bin1000\ 0001_{bin}
128 1000 0000bin1000\ 0000_{bin}
127 0111 1111bin0111\ 1111_{bin} 0111 1111bin0111\ 1111_{bin}
126 0111 1110bin0111\ 1110_{bin} 0111 1110bin0111\ 1110_{bin}
125 0111 1101bin0111\ 1101_{bin} 0111 1101bin0111\ 1101_{bin}
2 0000 0010bin0000\ 0010_{bin} 0000 0010bin0000\ 0010_{bin}
1 0000 0001bin0000\ 0001_{bin} 0000 0001bin0000\ 0001_{bin}
0 0000 0000bin0000\ 0000_{bin} 0000 0000bin0000\ 0000_{bin}
-1 1111 1111bin1111\ 1111_{bin}
-2 1111 1110bin1111\ 1110_{bin}
-126 1000 0010bin1000\ 0010_{bin}
-127 1000 0001bin1000\ 0001_{bin}
-128 1000 0000bin1000\ 0000_{bin}

En complément à deux sur huit bits, il est possible de représenter les nombres entiers de 27-2^7 (-128) à 2712^7 - 1 (127). Dans le cas général, sur NN bits, il est possible de représenter les entiers de 2N1-2^{N-1} à 2N112^{N-1}-1.

Nous proposons ci-dessous plusieurs techniques pour déterminer rapidement la représentation binaire de l’opposé d’un nombre.

Définition officielle du complément à deux

Pour obtenir la représentation binaire de l’opposé d’un nombre, le complément à deux se calcule en deux temps :

  1. Inverser tous les bits (complément à un).
  2. Additionner 1 au résultat.
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

Version rapide

Comparons les représentations binaires des nombres 2020 et 20-20 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 :

  1. Parcourir les bits du nombre en commençant par la droite jusqu’à rencontrer un 1. Conservez tous les bits parcourus sans modification, y compris le 1.
  2. Inverser les bits suivants.

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

Le poids du bit de signe

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 1000 0000bin1000\ 0000_{bin}. 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 :

128+64+32+8+4=20-128 + 64 + 32 + 8 + 4 = -20

Dans le cas général, le bit de poids fort d’un nombre représenté en complément à deux sur NN bits aura pour poids 2N1-2^{N-1}.

Quand ça déborde

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 83+52=13583 + 52 = 135. 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 :

a+b<0alors quea>0etb>0a+b>0alors quea<0etb<0ab<0alors quea>0etb<0ab>0alors quea<0etb>0\begin{array}{lllll} a + b < 0 & \text{alors que} & a > 0 & \text{et} & b > 0 \\ a + b > 0 & \text{alors que} & a < 0 & \text{et} & b < 0 \\ a - b < 0 & \text{alors que} & a > 0 & \text{et} & b < 0 \\ a - b > 0 & \text{alors que} & a < 0 & \text{et} & b > 0 \end{array}

Il ne faut pas confondre les notions de débordement et de retenue. Dans l’exemple ci-dessus, 83+5283 + 52, calculé en complément à deux sur huit bits, déborde mais ne produit pas de retenue.

Résumé

Le complément à deux est une convention pour représenter les nombres relatifs en binaire.

Un groupe de NN bits peut représenter les valeurs comprises entre 2N1-2^{N-1} et 2N112^{N-1}-1.

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 à 2N1-2^{N-1}.

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.