Comme la plupart des explications que j'ai vues, celles ci-dessus expliquent clairement comment travailler avec le complément à 2, mais n'expliquent pas vraiment ce qu'elles sont mathématiquement. J'essaierai de le faire, au moins pour les nombres entiers, et je couvrirai certains antécédents qui sont probablement familiers en premier.
Rappelez-vous comment cela fonctionne pour la décimale:
2345
est une façon d'écrire
2 × 10 3 + 3 × 10 2 + 4 × 10 1 + 5 × 10 0 .
De la même manière, le binaire est un moyen d'écrire des nombres en utilisant seulement 0 et 1 en suivant la même idée générale, mais en remplaçant les 10 ci-dessus par 2. Alors en binaire,
1111
est une façon d'écrire
1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0
et si vous le calculez, cela se révèle égal à 15 (base 10). C'est parce que c'est
8 + 4 + 2 + 1 = 15.
C'est très bien pour les nombres positifs. Cela fonctionne même pour les nombres négatifs si vous êtes prêt à coller un signe moins devant eux, comme le font les humains avec des nombres décimaux. Cela peut même être fait dans les ordinateurs, en quelque sorte, mais je n'ai pas vu un tel ordinateur depuis le début des années 1970. Je vais laisser les raisons d'une discussion différente.
Pour les ordinateurs, il s'avère plus efficace d'utiliser une représentation complémentaire pour les nombres négatifs. Et voici quelque chose qui est souvent négligé. Les notations de complément impliquent une sorte d'inversion des chiffres du nombre, même les zéros implicites qui précèdent un nombre positif normal. C'est gênant, car la question se pose: tous? Cela pourrait être un nombre infini de chiffres à considérer.
Heureusement, les ordinateurs ne représentent pas les infinis. Les nombres sont limités à une longueur (ou une largeur particulière, si vous préférez). Revenons donc à des nombres binaires positifs, mais avec une taille particulière. Je vais utiliser 8 chiffres ("bits") pour ces exemples. Donc, notre nombre binaire serait vraiment
00001111
ou
0 × 2 7 + 0 × 2 6 + 0 × 2 5 + 0 × 2 4 + 1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0
Pour former le complément négatif de 2, nous
complétons d' abord tous les chiffres (binaires) pour former 11110000
et ajoutons 1 pour former
11110001,
mais comment comprendre que cela signifie -15?
La réponse est que nous changeons la signification du bit de poids fort (le plus à gauche). Ce bit sera un 1 pour tous les nombres négatifs. Le changement sera de changer le signe de sa contribution à la valeur du nombre dans lequel il apparaît. Alors maintenant notre 11110001 est censé représenter
- 1 × 2 7 + 1 × 2 6 + 1 × 2 5 + 1 × 2 4 + 0 × 2 3 + 0 × 2 2 + 0 × 2 1 + 1 × 2 0
Remarquez que "-" devant cette expression? Cela signifie que le bit de signe porte le poids -2 7 , soit -128 (base 10). Toutes les autres positions conservent le même poids qu'elles avaient en nombres binaires non signés.
En calculant notre -15, c'est
-128 + 64 + 32 + 16 + 1
Essayez-le sur votre calculatrice. c'est -15.
Des trois principales façons dont j'ai vu des nombres négatifs représentés dans les ordinateurs, le complément 2 gagne haut la main pour plus de commodité dans l'utilisation générale. Il a cependant une bizarrerie. Comme il est binaire, il doit y avoir un nombre pair de combinaisons de bits possibles. Chaque nombre positif peut être associé à son négatif, mais il n'y a qu'un seul zéro. Nier un zéro vous fait zéro. Il y a donc une autre combinaison, le nombre avec 1 dans le bit de signe et 0 partout ailleurs. Le nombre positif correspondant ne correspondrait pas au nombre de bits utilisés.
Ce qui est encore plus étrange avec ce nombre, c'est que si vous essayez de former son positif en complétant et en ajoutant un, vous obtenez le même nombre négatif. Il semble naturel que zéro fasse cela, mais cela est inattendu et pas du tout le comportement auquel nous sommes habitués car, mis à part les ordinateurs, nous pensons généralement à un nombre illimité de chiffres, pas à cette arithmétique de longueur fixe.
C'est comme la pointe d'un iceberg de bizarreries. Il y a plus d'attente sous la surface, mais cela suffit pour cette discussion. Vous pourriez probablement en trouver plus si vous recherchez «débordement» pour l'arithmétique à virgule fixe. Si vous voulez vraiment vous lancer, vous pouvez également rechercher «l'arithmétique modulaire».