Informatique


Le complément à 2

Aller à

Représentation des entiers signés en mémoire

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: 0000 0000 (le zéro positif) et 1000 0000 (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  +   1000 0011 = 1000 0110

On arrive à -6 !!!

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


Représentation en 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

Le truc de la mort qui tue

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)


Une petite anecdote à 500 millions de US$

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...