Informatique


Le complément à 2

Aller à

Intuitivement

Les circuits électroniques digitaux ne peuvent enregistrer que des 0 ou des 1 mais pas de signes + ou -.

... et il s'agit là d'un solide problème! Comment donc représenter une valeur négative en mémoire?


Boum patatra

La solution consistant à prendre le bit de poids fort pour déterminer le signe n'est pas acceptable pour les 2 raisons suivantes:

  • On va avoir deux fois la valeur 0!
    Sur 8 bits: 00000000 (le zéro positif) et 10000000 (le zéro négatif)
  • Imaginons 2 chiffres codés sur 8 bits, faisons l'opération: (3 +(- 3)), on sera tous d'accord pour dire que cela doit faire 0!
        0000 0011   -->    3
    +  1000 0011   -->   -3

    1)00000111   -->   11

On arrive à 11 !!!

La solution se trouve dans le complément à 2n !


Complément à 2n

Le codage en complément à 2n permet de n'avoir qu'un seul zéro et de rencontrer l'addition.

Le complément à 2n d'un nombre c'est le nombre qu'il faut lui ajouter pour obtenir 2n.


Calcul du complément à 2n selon la définition

Par exemple, pour la valeur binaire 11011:

Complément à 25 de 11011: 100000 - 01011 =10101
10101 est la valeur à ajouter à 01011 pour obtenir 100000

Calcul du complément à 2n, autre manière

Pour trouver le complément à 2 d'un nombre binaire:

  • on fait le complément à 1 (opérateur !, le NON logique)
  • ensuite on ajoute 1.

Exemple: soit le nombre binaire positif représenté sur 8 bits: 00101101

  • Complément à 1 (NON logique), cela correspond à inverser tous les bits: 11010010
  • On ajoute 1 pour faire le complément à 2: 11010011
  • L'addition donne bien 0: 00101101 + 11010011 = 0
  •     00101101   -->    45
    +  11010011   -->   -45

    1)00000000   -->   0

Supposons des nombres en base 2 représentés sur 8 bits, nous nous proposons de représenter les nombres entiers négatifs au moyen du complément à 28.

base 10 base 2  
+ 45 00101101  
- 45 Complément à 28 = 11010011
Vérification: 1 0000 0000 - 00101101 font bien 11010011


Calcul du complément à 2n, pour les paresseux

Pour les plus paresseux d'entre vous on peut utiliser le truc suivant:

Exemple:
Soit le nombre binaire représenté sur 8 bits: 00010100 (2010)
On applique la recette: 11101100 (-2010)


Conventions du complément à 2

Intervalle représenté pour une configuration de 8bits

La définition de l'intervalle est respectée: -2n-1 est bien égale à -128 et 2n-1 - 1 est bien égale à 127.
n représente le nombre de bits de la configuration.

Le complément à 2 du complément à 2

Lorsque l'on fait le complément à 2 du complément à 2 on retrouve la valeur de départ.

Prenons la valeur (01011110)2 ou (94)10

Prenons le complément à 2 de (01011110)2: (100000000)2 - (01011110)2 = (10100010)2

Prenons le complément à 2 de (10100010)2: (100000000)2 - (10100010)2 = (01011110)2

Nous avons bien retrouvé la valeur de départ !

L'addition d'une valeur et de son complément à 2

L'addition d'une valeur et de son complément à 2 vaut 0, ... c'est assez logique puisqu'on additionne un nombre avec son négatif.

Reprenons l'exemple précédent:

(01011110)2 + (10100010)2 = (1000000000)2

(le 1 en première position est exclu car il dépasse le nombre de bits de la configuration (overflow).

CQFD !

De l'importance de la taille du mot mémoire (QWORD, DWORD, WORD, BYTE)

Une petite anecdote à 500 millions:

Le 4 juin 1996, une fusée Ariane 5 a explosé 40 secondes après l'allumage. La fusée et son chargement avaient coûté 500 millions de dollars. La commission d'enquête a rendu son rapport au bout de deux semaines. Il s'agissait d'une erreur de programmation dans le système inertiel de référence.
À un moment donné, un nombre codé en virgule flottante sur 64 bits (qui représentait la vitesse horizontale de la fusée par rapport à la plate-forme de tir) était converti en un entier sur 16 bits. Malheureusement, le nombre en question était plus grand que 32768, le plus grand entier que l'on peut coder sur 16 bits (WORD), et la conversion a été incorrecte.
Plouf, 500 millions dans l'Atlantique...