Le complément à deux

Représenter des nombres négatifs en binaire

En binaire, on représente naturellement les nombres positifs. Mais comment représenter des nombres négatifs ?

La solution la plus répandue est le complément à deux.

Le complément à deux permet d'utiliser les mêmes circuits pour faire des additions et des soustractions, que les nombres soient positifs ou négatifs.

Principe

On choisit une taille fixe en bits (souvent 8, 16, 32 ou 64 bits). Le bit le plus à gauche est appelé bit de signe :

  • 0 signifie que le nombre est positif
  • 1 signifie que le nombre est négatif

Le complément à deux permet de coder les entiers de 2n1-2^{n-1} à 2n112^{n-1}-1 pour nn bits.

Par exemple, sur 8 bits :

  • min : 27=128-2^7 = -128
  • max : 271=1272^7 - 1 = 127

Calcul du complément à deux

Pour coder un nombre négatif x-x sur nn bits :

  1. On code xx en binaire (positif) sur nn bits
  2. On inverse tous les bits (complément à un)
  3. On ajoute 1 au résultat
Complément à deux de xx (sur 8 bits) :
  • x=5x = 5 : 00000101
  • Inversion : 11111010
  • +1 : 11111011 ➜ c'est ça, la représentation de -5 !

Pourquoi ça marche ?

Parce qu'on obtient un comportement cohérent avec l'addition binaire :

TODO

Attention en Python !

En Python, les entiers ne sont pas limités à 8 bits. Ainsi :

~255 = -256

Cela peut provoquer des erreurs si on attend un résultat sur 8 bits.

Pour simuler une opération sur 8 bits en Python :
(~x) & 255
Cela permet de garder uniquement les 8 bits de droite (comme un octet).

Complément à deux et bornes

Sur 8 bits, les valeurs possibles sont :

BinaireDécimal
000000000
000000011
01111111127
11111111-1
11111110-2
10000000-128
En complément à deux sur 8 bits, il y a autant de nombres négatifs que positifs - sauf qu'il y a un négatif de plus.