La solution consistant à prendre le bit de poids fort pour déterminer le signe n'est pas acceptable pour les 2 raisons suivantes:
On arrive à -6 !!!
La solution se trouve dans le 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
L'opposé d'un nombre positif est son complément à 2n, c'est-à-dire son complément à 1 + 1.
Pour les plus paresseux d'entre vous on peut utiliser le truc suivant:
On garde tous les chiffres depuis la droite jusqu'au premier 1 (compris) puis on inverse tous les suivants.
Exemple:
Soit le nombre binaire représenté sur 8 bits: 00010100 (2010)
On applique la recette: 11101100 (-2010)
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...