C'est fait pour que l'addition n'ait pas besoin d'avoir de logique spéciale pour traiter les nombres négatifs. Consultez l'article sur Wikipédia .
Disons que vous avez deux nombres, 2 et -1. Dans votre manière "intuitive" de représenter les nombres, ils seraient 0010
et 1001
, respectivement (je m'en tiens à 4 bits pour la taille). À la manière du complément à deux , ils sont 0010
et 1111
. Maintenant, disons que je veux les ajouter.
L'ajout de complément à deux est très simple. Vous ajoutez des nombres normalement et tout bit de fin à la fin est rejeté. Ils sont donc ajoutés comme suit:
0010
+ 1111
=10001
= 0001 (discard the carry)
0001
est 1, ce qui est le résultat attendu de "2 + (- 1)".
Mais dans votre méthode "intuitive", l'ajout est plus compliqué:
0010
+ 1001
= 1011
Quel est -3, non? L'ajout simple ne fonctionne pas dans ce cas. Vous devez noter que l'un des nombres est négatif et utiliser un algorithme différent si tel est le cas.
Pour cette méthode de stockage "intuitive", la soustraction est une opération différente de l'addition, nécessitant des vérifications supplémentaires sur les nombres avant de pouvoir les ajouter. Puisque vous voulez que les opérations les plus élémentaires (addition, soustraction, etc.) soient aussi rapides que possible, vous devez stocker les nombres de manière à vous permettre d'utiliser les algorithmes les plus simples possibles.
De plus, dans la méthode de stockage "intuitive", il y a deux zéros:
0000 "zero"
1000 "negative zero"
Qui sont intuitivement le même nombre mais ont deux valeurs différentes lors de leur stockage. Chaque application devra prendre des mesures supplémentaires pour s'assurer que les valeurs non nulles ne sont pas non plus un zéro négatif.
Il y a un autre avantage à stocker les ints de cette façon, et c'est à ce moment-là que vous devez étendre la largeur du registre dans lequel la valeur est stockée. bit le plus significatif:
0001 (one, in four bits)
00000001 (one, in eight bits)
1110 (negative two, in four bits)
11111110 (negative two, in eight bits)
Il suffit de regarder le bit de signe du petit mot et de le répéter jusqu'à ce qu'il remplisse la largeur du plus gros mot.
Avec votre méthode, vous devrez effacer le bit existant, ce qui est une opération supplémentaire en plus du remplissage:
0001 (one, in four bits)
00000001 (one, in eight bits)
1010 (negative two, in four bits)
10000010 (negative two, in eight bits)
Vous devez toujours définir ces 4 bits supplémentaires dans les deux cas, mais dans le cas "intuitif", vous devez également effacer le 5e bit. Il s'agit d'une toute petite étape supplémentaire dans l'une des opérations les plus fondamentales et les plus courantes de chaque application.