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.
Repère
À NOTEROn 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 (on dit « b barre ») le complément à 1 du bit b.
Exemples : Le complément à 1 de 1001 est 0110 ; et .
L’opposé d’un nombre est le nombre vérifiant .
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 le complément à 1 du bit (ainsi et ).
Alors, pour un nombre sur 8 bits :
donc .
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.