Aller au contenu

Partie 2 : Représentation des entiers relatifs


Jusqu'ici, nous avons représenté uniquement des entiers positifs (ou nuls). Mais comment représenter des nombres négatifs en binaire, alors que nous ne disposons que de 0 et de 1 ?

Plusieurs solutions ont été envisagées au cours de l'histoire de l'informatique.

L'idée la plus naturelle consiste à réserver le bit de poids fort (le bit le plus à gauche) pour indiquer le signe :

  • 0 en tête = nombre positif ;
  • 1 en tête = nombre négatif.

Sur 8 bits, le nombre +5 serait codé 00000101 et le nombre -5 serait codé 10000101.

Cette méthode n'est donc pas utilisée dans les ordinateurs modernes. On lui préfère le complément à 2.


Le complément à 2 est la méthode standard utilisée par tous les processeurs actuels pour représenter les entiers relatifs.

On travaille toujours sur un nombre fixe de bits (par exemple 8 bits). Les règles sont :

  • Les entiers positifs sont codés normalement en binaire, avec un 0 en tête.
  • Les entiers négatifs sont obtenus par un procédé appelé complément à 2.
  • Le bit de poids fort indique le signe : 0 pour positif, 1 pour négatif.

2.2 Comment obtenir le complément à 2 d'un nombre ?

Section intitulée « 2.2 Comment obtenir le complément à 2 d'un nombre ? »

Pour coder un nombre négatif -N sur n bits :

  1. Écrire N en binaire sur n bits.
  2. Inverser tous les bits (0 devient 1, 1 devient 0). C'est le complément à 1.
  3. Ajouter 1 au résultat.

2.3 Comment décoder un nombre en complément à 2 ?

Section intitulée « 2.3 Comment décoder un nombre en complément à 2 ? »

Si le bit de poids fort vaut 0, le nombre est positif : on le lit directement.

Si le bit de poids fort vaut 1, le nombre est négatif. Pour trouver sa valeur absolue, on applique à nouveau le complément à 2 (la méthode est son propre inverse) :

  1. Inverser tous les bits.
  2. Ajouter 1.
  3. Le résultat est la valeur absolue ; le nombre original est négatif.

La beauté du complément à 2, c'est que l'addition fonctionne naturellement, sans se soucier des signes. Vérifions que 45 + (-45) = 0 :

00101101 (45)
+ 11010011 (-45)
----------
1 00000000

On obtient 9 bits, mais on travaille sur 8 bits : le bit de dépassement (le 1 tout à gauche) est ignoré. Le résultat est bien 00000000, soit 0. ✓

C'est l'avantage décisif du complément à 2 : les mêmes circuits électroniques servent pour l'addition des positifs et des négatifs.


Sur n bits en complément à 2, on peut représenter les entiers de -2ⁿ⁻¹ à 2ⁿ⁻¹ - 1.

Nombre de bitsValeur minimaleValeur maximaleNombre de valeurs
8-128127256
16-32 76832 76765 536
32-2 147 483 6482 147 483 647environ 4,3 milliards
64environ -9,2 × 10¹⁸environ 9,2 × 10¹⁸environ 1,8 × 10¹⁹
DécimalBinaire (8 bits)
12701111111
100000001
000000000
-111111111
-211111110
-12710000001
-12810000000

Quand le résultat d'un calcul sort de l'intervalle représentable, on parle de dépassement de capacité (en anglais overflow).


5. Évaluer le nombre de bits d'une somme ou d'un produit

Section intitulée « 5. Évaluer le nombre de bits d'une somme ou d'un produit »

Si A est codé sur n₁ bits et B sur n₂ bits, leur somme A + B peut nécessiter au plus :

max(n₁, n₂) + 1 bits

Le « + 1 » correspond à une éventuelle retenue.

Si A est codé sur n₁ bits et B sur n₂ bits, leur produit A × B peut nécessiter au plus :

n₁ + n₂ bits


Contrairement à la plupart des langages de programmation, Python gère des entiers de taille arbitraire : il n'y a pas de limite au nombre de bits utilisés. Python adapte automatiquement la taille en mémoire.

>>> 2 ** 100
1267650600228229401496703205376
>>> 2 ** 1000 # un nombre de plus de 300 chiffres !
107150860718626732094842504906000181056140481170553360744375038837035105112493612249319
...

Aucun risque de dépassement de capacité en Python.

En Python, les nombres négatifs ne sont pas stockés en complément à 2 (puisque la taille est variable). Mais on peut simuler le complément à 2 sur n bits :

def complement_a_2(n, bits=8):
"""Affiche le codage en complément à 2 de n sur un nombre donné de bits."""
if n >= 0:
return bin(n)[2:].zfill(bits)
else:
return bin((1 << bits) + n)[2:]
print(complement_a_2(45)) # 00101101
print(complement_a_2(-45)) # 11010011
print(complement_a_2(-1)) # 11111111
print(complement_a_2(-128)) # 10000000

ConceptDétail
Méthode standardComplément à 2
Bit de poids fort0 = positif, 1 = négatif
Obtenir -NInverser tous les bits, puis ajouter 1
Intervalle sur n bitsDe -2ⁿ⁻¹ à 2ⁿ⁻¹ - 1
Tailles courantes8, 16, 32, 64 bits
Avantage principalL'addition fonctionne sans distinction de signe
Dépassement de capacitéLe résultat sort de l'intervalle représentable
PythonEntiers de taille arbitraire (pas de dépassement)