Informatique · Première · 5 min de lecture
Complément à deux : écrire les entiers négatifs en binaire
Représentation d'un entier relatif sur n bits par le complément à deux : le bit de poids fort a le poids −2^(n−1) ; intervalle représentable de −2^(n−1) à 2^(n−1) − 1 ; codage de −x en inversant les bits de x puis en ajoutant 1 ; l'addition binaire ordinaire reste valable, la retenue sortante étant ignorée ; dépassement de capacité.
Chapitre du programme : Numérique et sciences informatiques (spécialité)
Bloc 1 sur 7 · Comprendre
Comprendre : un bit de poids négatif
Sur 8 bits, on peut écrire 2 × 2 × … × 2 = 256 motifs différents. Pour les entiers positifs, ils codent 0 à 255. Pour coder aussi des entiers négatifs, la convention utilisée par les ordinateurs est le complément à deux :
Sur n bits, le bit de gauche (bit de poids fort) a pour poids −2ⁿ⁻¹ au lieu de +2ⁿ⁻¹ ; les autres bits gardent leur poids habituel.
Sur 8 bits, les poids deviennent donc −128, 64, 32, 16, 8, 4, 2, 1. Par exemple :
| Poids | −128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|---|
| Bits | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 |
Valeur : −128 + 64 + 16 + 8 + 2 + 1 = −37.
Conséquences immédiates : un motif qui commence par 0 code un entier positif ou nul ; un motif qui commence par 1 code un entier négatif ; sur 8 bits, on code les entiers de −128 à 127.
Bloc 2 sur 7 · Approfondir
Approfondir : coder −x, et pourquoi c'est commode
Méthode pour coder −x (x positif). On écrit x sur n bits, on inverse tous les bits (0 ↔ 1), puis on ajoute 1. Pour −37 sur 8 bits : 37 s'écrit 0010 0101 ; inversé : 1101 1010 ; plus 1 : 1101 1011.
Une autre façon de le dire : sur 8 bits, le motif de −x est l'écriture binaire de 256 − x (ici 256 − 37 = 219). La fonction suivante suppose un entier x dans l’intervalle −128 à 127 ; elle ne vérifie pas elle-même cette précondition :
def code8(x):
if x < 0:
x = x + 256
return format(x, "08b")
print(code8(37))
print(code8(-37))
print(code8(-128))00100101
11011011
10000000Dans l’autre sens, la fonction suivante suppose un motif composé d’exactement huit bits. Si sa valeur non signée atteint 128, il code un entier négatif : on lui retire 256.
def valeur8(motif):
v = int(motif, 2)
if v >= 128:
v = v - 256
return v
print(valeur8("11011011"))
print(valeur8("01111111"))
print(valeur8("10000000"))-37
127
-128Pourquoi cette convention ? Parce que l’addition binaire ordinaire, en ne conservant que n bits, calcule une somme modulo 2ⁿ. Elle donne la somme entière signée seulement si le résultat est représentable. Dans l’exemple suivant, cette condition est satisfaite : 37 + (−37) donne 0010 0101 + 1101 1011 = 1 0000 0000 ; on ne garde que les 8 bits de droite, 0000 0000, c'est-à-dire 0. Le processeur n'a pas besoin d'un circuit spécial pour les négatifs.
Tailles courantes. On utilise des entiers de 8, 16, 32 ou 64 bits ; sur n bits, l'intervalle codé va de −2ⁿ⁻¹ à 2ⁿ⁻¹ − 1. Un résultat qui sort de l'intervalle provoque un dépassement de capacité. Les entiers de Python, eux, n'ont pas de taille fixe.
Bloc 3 sur 7 · Exemple
Exemple guidé : décoder 1110 0101
Énoncé. Sur 8 bits en complément à deux, quel entier code le motif 1110 0101 ?
Résolution.
- Le bit de gauche vaut 1 : l'entier est négatif, et ce bit pèse −128.
- Les sept autres bits, 110 0101, valent 64 + 32 + 4 + 1 = 101.
- L'entier est −128 + 101 = −27.
Contrôle par la méthode inverse. 27 s'écrit 0001 1011 ; inversé : 1110 0100 ; plus 1 : 1110 0101. On retrouve bien le motif de départ.
Bloc 4 sur 7 · Visualiser
Voir : le cercle des motifs sur 8 bits
Les motifs se suivent comme sur un cercle : en ajoutant 1 au plus grand positif, on passe au plus petit négatif.
| Motif | Valeur ordinaire | Valeur en complément à deux |
|---|---|---|
| 0000 0000 | 0 | 0 |
| 0000 0001 | 1 | 1 |
| 0111 1111 | 127 | 127 |
| 1000 0000 | 128 | −128 |
| 1000 0001 | 129 | −127 |
| 1111 1110 | 254 | −2 |
| 1111 1111 | 255 | −1 |
Tout motif commençant par 1 vaut sa valeur ordinaire moins 256.
Continuez sur votre lancée
Vous avez découvert l’essentiel et un exemple. Retrouvez la suite du cours et les points à retenir, puis passez à l’entraînement guidé dans votre compte.
- Les formules et les repères à retenir
- Les erreurs fréquentes expliquées
- Un exercice avec des aides et sa correction
L’accès gratuit comprend les cours et exercices de votre niveau choisi.
Sources
- BO spécial n°1 du 22 janvier 2019 — programme de spécialité numérique et sciences informatiques de première, « Représentation binaire d'un entier relatif »
- T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein, Algorithmique (Introduction to Algorithms), 3e édition française, Dunod
- Documentation officielle de Python 3 — fonctions natives format et int (https://docs.python.org/3/library/functions.html)
Vous pensez avoir trouvé une erreur dans cette leçon ? Signalez-la par e-mail.