Le signe d’un nombre peut prendre deux valeurs (positif ou négatif), il suffit donc d’un bit pour le représenter. Mais les ordinateurs représentent les entiers négatifs à l’aide d’un codage plus approprié qui facilite les opérations arithmétiques : le complément à 2n.
I. Représentation des nombres entiers – convention
1) Le binaire non signé
Les entiers naturels sont codés sur machine en base 2 sur un nombre arbitraire de bits. Pour simplifier nos illustrations, nous considérerons des entiers codés sur 8 bits.
À noter
On peut travailler sur 8 bits en Python grâce à la fonction int8 de la bibliothèque numpy.
Dans la représentation binaire non signée, les nombres entiers naturels sont écrits en base 2.
Exemple : Le nombre « dix » en base 10, s’écrit 1010 en base 2. Dans la mémoire, sur 8 bits, il est codé 00001010.
Pour une mémoire à 8 bits, tous les entiers naturels de 0 à 255 peuvent donc être représentés de cette façon.
2) Le binaire signé
Dans la représentation en binaire signé, le bit de poids fort (le plus à gauche) sert à représenter le signe : 0 pour un entier positif et 1 pour un entier négatif.
Utiliser les n autres bits pour représenter la valeur absolue du nombre en binaire non signé pose problème : on se retrouverait avec deux zéros et l’addition ne fonctionnerait plus.
Exemple : Sur quatre bits, si on utilise l’algorithme d’addition habituel, 3 + (−2) serait égal à −5 :
On code les nombres signés avec le complément à 2n.
II. Le complément à 2n
Ce codage permet de représenter les entiers relatifs tout en ne changeant pas d’algorithme d’addition.
1) Définitions
Prendre le complément à 1 d’un nombre consiste à inverser les 0 et les 1 de son écriture binaire. Par la suite on notera b¯ (on dit « b barre ») le complément à 1 du bit b.
Exemples : Le complément à 1 de 1001 est 0110 ; 1¯=0 et 0¯=1.
L’opposé d’un nombre x est le nombre y vérifiant x+y=0.
Exemple : L’opposé de 3 est −3 car 3 + (−3) = 0.
Le complément à 2nd’un nombre, c’est le nombre qu’il faut lui ajouter pour obtenir 2n.
2) Opposé d’un nombre en 8 bits
On remarque astucieusement qu’un nombre d’un octet plus son complément à 1 s’écrit 1111 1111.
Par exemple sur 8 bits : 1001 1010 + 0110 0101 = 1111 1111.
On note b¯ le complément à 1 du bit b (ainsi 1¯=0 et 0¯=1).
Alors, pour un nombre sur 8 bits :
(b7b6b5b4b3b2b1b0+b7¯b6¯b5¯b4¯b3¯b2¯b1¯b0¯)+1=1111 1111+1=(1)0000 0000
donc b7b6b5b4b3b2b1b0+b7¯b6¯b5¯b4¯b3¯b2¯b1¯b0¯+1=0.
Par convention l’opposé d’un nombre positif est son complément à 2taille des entiers c’est-à-dire son complément à 1, plus 1.
Exemple : On cherche l’opposé du nombre positif 3.
3 s’écrit 0000 0011 sur 8 bits. Le complément à 1 est donc 1111 1100.
L’opposé (−3) s’écrit alors 1111 1100 + 1 = 1111 1101.
Pour connaître le nombre que représente un entier négatif, on effectue la démarche inverse : on lui retranche 1 puis on prend son complément à 1.
Exemple : On cherche à quel entier relatif correspond 1011 0101. C’est un nombre négatif car son premier bit vaut 1.
On lui retranche 1 : 1011 0101 − 1 = 1011 0100.
On prend le complément à 1 de ce dernier nombre : 0100 1011.
On convertit en base 10 (en lisant de droite à gauche) : 20 + 21 + 23 + 26 = 75.
1011 0101 est donc l’écriture sur 8 bits de −75.