Techniquement le tour de passe-passe s'appelle "la représentation en complément à deux".
Mais ça n'est pas très facile à comprendre. Nous allons voir plus loin comment découvrir et comprendre la chose.
Faisons d'abord quelques rappels de représentation binaire des nombres.
Considérons une machine avec des mots de 4 bits.
On peut utiliser ces 4 bits pour représenter les entiers naturels de 0 à 15:
0000 = 0 0001 = 1 0010 = 2 0011 = 3
0100 = 4 0101 = 5 0110 = 6 0111 = 7
1000 = 8 1001 = 9 1010 = 10 1011 = 11
1100 = 12 1101 = 13 1110 = 14 1111 = 15
Maintenant, si l'on veut représenter des nombres positifs ou nuls et des nombres négatifs sur ces 4 bits, on vous dira que ça donne ça:
0000 = 0 0001 = 1 0010 = 2 0011 = 3
0100 = 4 0101 = 5 0110 = 6 0111 = 7
1000 = -8 1001 = -7 1010 = -6 1011 = -5
1100 = -4 1101 = -3 1110 = -2 1111 = -1
Ce qui est magique, c'est que pour faire 7 - 5
on ne va pas faire de soustraction mais additionner le nombre 7 et le nombre -5:
0111
+1011
Et pour ça on fait comme l'addition que l'on apprend à l'école primaire en décimal, avec une retenue, et comme table d'addition
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 0 avec une retenue de 1
1110 <----- retenue
0111
+1011
----------------------
10010
Dans ce calcul, le résultat tient sur 5 bits, mais dans les mots de la machine il n'y en a que 4, donc le résultat est
0010, soit 2 en décimal, ce qui est très satisfaisant!
La question est donc de savoir comment, quand on veut soustraire 5 (0101) on passe à -5 (1011).
Pour y répondre, pensez à votre compte en banque.
Si vous n'êtes pas très riche, vous avez pris l'habitude de ne regarder que les 4 derniers chiffres :-)
Si votre compte est à 3527 euros, et que vous retirez 2000 euros, il vous reste 1527 euros
Mais si par miracle -ou par erreur- vous recevez un virement de 8000 euros, si vous continuez à regarder les 4 derniers chiffres, vous trouvez aussi 1527 euros!
Si votre compte est à 3527 euros, et que vous retirez 2215 euros, il vous reste 1312 euros
Mais si par miracle -ou par erreur- vous recevez un virement de 7785 euros, si vous continuez à regarder les 4 derniers chiffres, vous trouvez aussi 1312 euros!
Autrement dit, à vos yeux pessimistes:
-- ajouter 8000 euros, c'est la même chose qu'en soustraire 2000
-- ajouter 7785 euros, c'est la même chose qu'en soustraire 2215
Pour économiser la soustraction -il n'y a pas de petites économies-, il suffit donc de savoir passer de:
-2000 à + 8000
-2215 à + 7785
Comment ça se passe ?
Ne répondez pas "il suffit de retrancher le nombre de départ à 10000", puisque l'on s'interdit la soustraction!
Il faut trouver un moyen qui ne fait pas intervenir la soustraction.
Prenez d'autres exemples de couples comme 2215 et 7785 et vous allez vite vous apercevoir que:
Le second nombre se déduit du premier en remplaçant chaque chiffre par son complément à 9, sauf pour le premier, où on prend son complément à 10:
2 --> 7
1 --> 8
5 --> 5
Ce qui est est équivalent à dire:
-- on remplace chaque chiffre par son complément à 9
-- on ajoute 1 au résultat
Finalement, on s'est bien débarrassé de la soustraction en la remplaçant par un complément à 9 de chaque chiffre et une addition de 1. C'est gagné!
En décimal, le 9 est le plus grand des chiffres de 0 à 9
En binaire, le rôle du 9 est remplacé par le plus grand chiffre de 0 à 1, soit 1.
Il faut donc prendre le complément à 1 de chaque bit, ce qui revient à l'inverser:
0 --> 1
1 --> 0
Et comme
- l'inversion d'un bit est la plus simple des opérations réalisables avec des portes logiques
- ajouter 1 à un nombre est "gratuit" car tout additionneur comporte une entrée "retenue", qu'il suffit de mettre à 1 pour ajouter 1