232 votes

Pourquoi ya deux ' complément s utilisé pour représenter des nombres négatifs ?

Je suis juste curieux de savoir si il y a une raison pourquoi afin de représenter -1 en binaire, le complément à deux est utilisé : renversant les morceaux et en ajoutant 1 ?

-1 est représentée par 11111111 (complément à deux) et non (pour moi plus intuitive) 10000001, c'est-à-dire 1 binaire avec le premier bit comme indicateur négatif.

AVERTISSEMENT : je ne vous fiez sur arithmétique binaire pour mon travail !

372voto

Welbog Points 32952

Il est fait de sorte que plus n'a pas besoin d'avoir de la logique pour traiter les nombres négatifs. Découvrez l'article sur Wikipédia.

Disons que vous avez deux numéros, 2 et -1. Dans votre "intuition" manière de représenter les nombres, ils seraient en 0010 et 1001, respectivement (je suis coller à 4 bits pour la taille). En complément à deux, elles sont 0010 et 1111. Maintenant, disons que je veux ajouter.

En complément à deux outre est très simple. Vous ajoutez des numéros normalement et aucun bit de retenue à la fin est supprimée. Ils sont donc ajouté comme suit:

  0010
+ 1111
=10001
= 0001 (discard the carry)

0001 est de 1, ce qui est ce que nous attendions la suite de "2+(-1)".

Mais dans votre "intuitive" de la méthode, l'ajout est plus compliqué:

  0010
+ 1001
= 1011

Qui est -3, droit? Plus Simple ne fonctionne pas dans ce cas. Vous avez besoin de noter que l'un des nombres est négatif et l'utilisation d'un algorithme différent si c'est le cas.

Pour cette "intuitive" méthode de stockage, la soustraction est une opération de plus, l'exigence des contrôles supplémentaires sur les numéros avant qu'ils puissent être ajoutés. Puisque vous voulez la plupart des opérations de base (addition, soustraction, etc) pour être aussi rapide que possible, vous avez besoin de stocker des nombres dans une manière qui vous permet d'utiliser le plus simple des algorithmes possible.

En outre, dans le "intuitive" méthode de stockage, il y a deux zéros:

0000  "zero"
1000  "negative zero"

Qui sont intuitivement le même numéro, mais avoir deux valeurs différentes lorsqu'elles sont stockées. Chaque application devra prendre des mesures supplémentaires pour s'assurer que les valeurs non nulles sont pas aussi négatif zéro.

Il y a un autre bonus avec le stockage des entiers de cette façon, et c'est quand vous avez besoin d'étendre la largeur de ce registre, la valeur est stockée dans. Avec en complément à deux, le stockage d'un 4-nombre de bits en 8 bits registre est une question de répéter son bit de poids fort:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1110 (negative two, in four bits)
11111110 (negative two, in eight bits)

C'est juste une question de regarder le bit de signe de la plus petite parole et le répéter jusqu'à ce qu'elle augmente la largeur du plus grand mot.

Avec votre méthode, vous devrez effacer le mot de bits, ce qui est un plus en plus padding:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1010 (negative two, in four bits)
10000010 (negative two, in eight bits)

Vous devez encore définir les 4 bits dans les deux cas, mais dans le "intuitive" cas, vous devez effacer la 5ème peu aussi. C'est une petite étape supplémentaire dans l'une des plus fondamentales et les opérations les plus courantes présentes dans chaque application.

20voto

Yacoby Points 29771

Wikipédia dit tout:

Le complément à deux, le système a l'avantage de ne pas exiger que l'addition et la soustraction des circuits de scruter les signes des opérandes pour déterminer s'il faut ajouter ou soustraire. Cette propriété en fait un système à la fois plus simple à mettre en œuvre et capable de facilement supporter une plus grande précision en arithmétique. Aussi, le zéro n'a qu'une seule représentation, ce qui évite les subtilités associée à une baisse de zéro, ce qui existe dans un " complément de systèmes.

En d'autres termes, l'ajout est le même, si le nombre est négatif.

9voto

Zifre Points 14109

Complément à deux permet l’addition et la soustraction à faire de la manière habituelle (comme vous blesser pour les nombres non signés). Elle empêche aussi - 0 (une façon distincte pour représenter 0 qui ne serait pas égal à 0 avec la méthode normale de bit par bit de comparaison de nombres).

6voto

Stefano Verna Points 175

Il s’agit de simplifier les sommes et différences de nombres. une somme d’un nombre négatif et compléments un positif un codifiée dans 2 est identique à les résumer de la manière habituelle.

6voto

CodeFusionMobile Points 6173

En complément à deux permet positifs et négatifs des nombres à additionner, sans logique.

Si vous avez essayé d'ajouter 1 et -1 à l'aide de votre méthode
10000001 (-1)
+00000001 (1)
vous obtenez
10000010 (-2)

Au lieu de cela, en utilisant en complément à deux, nous pouvons ajouter

11111111 (-1)
+00000001 (1) vous obtenez
00000000 (0)

La même chose est vraie pour la soustraction.

Aussi, si vous essayez de soustraire 4 de 6 (deux nombres positifs), vous pouvez complément de 2 4 et ajouter les deux ensemble 6 + (-4) = 6 - 4 = 2

Cela signifie que la soustraction et l'addition de deux nombres positifs et négatifs peut être fait par le même circuit dans le cpu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X