Question

Je suis curieux de savoir s'il y a une raison pour laquelle pour représenter -1 en binaire, le complément à deux est utilisé: en feuilletant les bits et en ajoutant 1

-1 est représenté par 11.111.111 (complément à deux de) plutôt que (pour moi plus intuitive) 10000001 qui est binaire avec une première bit drapeau comme négatif.

Disclaimer: Je ne repose pas sur l'arithmétique binaire pour mon travail

Était-ce utile?

La solution

Il est fait pour que l'addition n'a pas besoin d'avoir une logique spéciale pour traiter les nombres négatifs. Consultez l'article sur Wikipédia .

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

L'ajout du complément à deux est très simple. Vous ajoutez des numéros normalement et tout bit de report à la fin est mis au rebut. Donc, ils sont ajoutés comme suit:

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

0001 est 1, qui est le résultat attendu de "2 + (- 1)."

Mais dans votre méthode "intuitive", ajoutant est plus complexe:

  0010
+ 1001
= 1011

Ce qui est -3, non? La simple addition ne fonctionne pas dans ce cas. Vous devez noter que l'un des numéros est négatif et d'utiliser un algorithme différent si tel est le cas.

Pour cette méthode de stockage « intuitive », la soustraction est une autre opération que l'addition, ce qui nécessite des contrôles supplémentaires sur les numéros avant de pouvoir être ajoutés. Puisque vous voulez que les opérations les plus élémentaires (addition, soustraction, etc.) pour être aussi rapide que possible, vous devez enregistrer les numéros d'une manière qui vous permet d'utiliser les algorithmes les plus simples possibles.

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

0000  "zero"
1000  "negative zero"

Quelles sont intuitivement le même nombre mais ont deux valeurs différentes lorsqu'elles sont stockées. Chaque application devra prendre des mesures supplémentaires pour faire en sorte que les valeurs non nulles sont pas non plus zéro négatif.

Il y a un autre bonus avec le stockage ints de cette façon, et c'est quand vous avez besoin d'étendre la largeur du registre la valeur est stockée. Avec le complément à deux, le stockage d'un nombre de 4 bits dans un registre 8 bits est une question de répéter son 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 est juste une question de regarder le bit de signe du mot plus petit et le répéter jusqu'à ce que la largeur de pads le plus grand mot.

Avec votre méthode que vous devez effacer le bit existant, ce qui est une opération supplémentaire en plus de rembourrage:

    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 « intuitive », vous devez effacer le 5ème bit ainsi. Il est un petit pas supplémentaire dans l'un des plus fondamentaux et les opérations communes présentes dans toutes les applications.

Autres conseils

Wikipedia dit tout:

  

Le système a en complément à deux l'avantage de ne pas exiger que le circuit d'addition et de soustraction examiner les signes des opérandes pour déterminer si vous souhaitez ajouter ou soustraire. Cette propriété rend le système plus simple à mettre en œuvre à la fois et capable de gérer facilement l'arithmétique de précision supérieure. En outre, nul n'a qu'une seule représentation, parant les subtilités associées à zéro négatif, qui existe dans les systèmes ones'-complément.

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

Même si cette question est vieux, laissez-moi mettre mes 2 cents.

Avant d'expliquer cela, permet de revenir à l'essentiel. complément 2' est le complément de 1 + 1. Maintenant, ce qui est le complément de 1 et quelle est sa signification en plus.

Somme d'un nombre n bits et le complément de son 1 vous donne le plus grand nombre possible qui peut être représenté par les n bits. Exemple:

 0010 (2 in 4 bit system)
+1101 (1's complement of 2)
___________________________
 1111  (the highest number that we can represent by 4 bits)

Maintenant, ce qui se passera si nous essayons d'ajouter 1 plus au résultat. Il sera traduit par un trop-plein.

Le résultat sera 1 0000 qui est 0 (comme nous travaillons avec 4 numéros de bits, (le 1 à gauche est un trop-plein)

Any n-bit number + its 1's complement = max n-bit number
Any n-bit number + its 1'complement + 1 = 0 ( as explained above, overflow will occur as we are adding 1 to max n-bit number)

Quelqu'un a alors décidé d'appeler 1 complément à + 1 2'complement. Ainsi, la déclaration ci-dessus devient: Tout numéro de n'bit + son complément 2 = 0 ce qui signifie que le complément à 2 d'un nombre = - (de ce nombre)

Tout cela donne une question, pourquoi peut-on utiliser uniquement le (n-1) des n bits pour représenter nombre positif et pourquoi le bit le plus nième gauche représentent signe (0 sur les plus à gauche des moyens de bits + ve nombre, et 1 signifie le numéro -ve). par exemple, pourquoi ne nous utilisons seulement les 31 premiers bits d'un entier en Java pour représenter le nombre positif si le 32e bit est 1, son numéro un -ve.

 1100 (lets assume 12 in 4 bit system)
+0100(2's complement of 12)
___________________________

1 0000 (résultat est zéro, avec le report débordement 1)

Ainsi, le système de (n + 2'complement de n) = 0, fonctionne toujours. La seule ambiguïté est 2 complément de 12 est 0100, qui représente aussi ambigüe 8, autre que représentant -12 dans le système de complément à 2.

Ce problème sera résolu si les nombres positifs ont toujours 0 dans leur bit le plus à gauche. Dans ce cas, leur complément de 2 aura toujours un 1 dans leur bit le plus à gauche, et nous avons l'habitude de l'ambiguïté du même ensemble de bits représentant un numéro de complément 2 ainsi qu'un + ve nombre.

complément de deux permet addition et la soustraction à faire de la manière normale (comme vous blessure pour les nombres non signés). Elle empêche également -0 (d'une manière distincte pour représenter 0 qui ne serait pas égal à 0 avec la méthode bit par bit normal de la comparaison des nombres).

est de simplifier sommes et des différences de chiffres. une somme d'un nombre négatif et un positif codifié dans les compléments à 2 est le même que les résumer de la manière normale.

La mise en œuvre habituelle de l'opération est « FLIP les bits et ajouter 1 », mais il y a une autre façon de définir ce qui fait sans doute la raison d'être plus claire. Complément à 2 est la forme que vous obtenez si vous prenez la représentation habituelle non signé où chaque bit contrôle la puissance de 2 suivante, et juste faire le terme le plus négatif significatif.

Prendre une valeur de 8 bits a 7 a 6 a 5 a 4 a 3 a 2 a 1 a 0

L'interprétation habituelle binaire non signé est:
2 7 * a 7 + 2 6 * a 6 + 2 5 * a 5 + 2 4 * a 4 + 2 3 * a 3 + 2 2 * a 2 + 2 1 * a 1 + 2 0 * un 0
11111111 = 64 + 128 + 32 + 16 + 8 + 4 + 2 + 1 = 255

Les deux interprétation du complément est:
-2 7 * a 7 + 2 6 * a 6 + 2 5 * a 5 + 2 4 * a 4 + 2 3 * a 3 + 2 2 * a 2 + 2 1 * a 1 + 2 0 * a 0
11111111 = + 64 + -128 32 + 16 + 8 + 4 + 2 + 1 = -1

Aucun des autres bits changer en un sens à tout, et portant dans un 7 est « trop-plein » et ne devrait pas travailler, donc à peu près toutes les opérations arithmétiques travail sans modification (comme d'autres c'est noté). Magnitude signe généralement inspecter le bit de signe et utiliser une logique différente.

Complément à deux permet nombres positifs et négatifs à additionner sans aucune logique particulière.

Si vous avez essayé d'ajouter 1 et -1 en utilisant votre méthode
 10000001 (-1)
+00000001 (1)
vous obtenez
 10000010 (-2)

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

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

La même chose est vraie pour la soustraction.

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

Cela signifie que la soustraction et l'addition des deux nombres positifs et négatifs peuvent toutes être effectuées par le même circuit dans l'unité centrale de traitement.

Pour développer des réponses autres:

En complément à deux

  • Ajout est le même mécanisme que des nombres entiers positifs simples ajoutant.
  • Soustraction ne change pas trop
  • trop Multiplication!

Division ne nécessite un mécanisme différent.

Toutes sont vraies parce que le complément à deux est tout simplement arithmétique modulaire normale, où nous choisissons de regarder quelques chiffres comme négatif en soustrayant le modulo.

La lecture des réponses à cette question, je suis tombé sur ce commentaire [edited].

  

2 du complément à 0100 (4) sera 1100. Maintenant 1100 est 12 si je dis normalement. Alors,   quand je dis normale 1100 il est de 12, mais quand je dis le complément de 2 1100 puis   il est -4? En outre, en Java lorsque 1100 (laisse supposer 4 bits pour l'instant) est stocké puis   comment il est déterminé si elle est ou -4 ?? + 12 - hagrawal 2 juillet à 16h53

À mon avis, la question posée dans ce commentaire est tout à fait intéressant et donc je voudrais tout d'abord la reformuler et de fournir une réponse et un exemple.

QUESTION - Comment le système peut établir comment une ou plusieurs octets adjacents doivent être interprétés? En particulier, comment le système peut déterminer si une séquence donnée d'octets est un nombre binaire simple ou un numéro de complément de 2?

REPONSE - Le système établit la façon d'interpréter une séquence d'octets par types. Types définir

  • combien d'octets doivent être considérés comme
  • comment ces octets doivent être interprétées

Exemple - Ci-dessous, nous supposons que

  • Années char sont 1 octet long
  • short sont de 2 octets
  • et de int pour float sont 4 octets

S'il vous plaît noter que ces tailles sont spécifiques à mon système. Bien que peu commune, ils peuvent être différents d'un système à. Si vous êtes curieux de ce qu'ils sont sur votre système, utilisez l'opérateur de .

Tout d'abord, on définit un tableau contenant 4 octets et initialiser chacun d'eux pour le nombre binaire 10111101, correspondant au nombre hexadécimal BD.

// BD(hexadecimal) = 10111101 (binary)
unsigned char   l_Just4Bytes[ 4 ]   =   { 0xBD, 0xBD, 0xBD, 0xBD };

Alors on lit le contenu du tableau en utilisant différents types.

unsigned char et signed char

// 10111101 as a PLAIN BINARY number equals 189
printf( "l_Just4Bytes as unsigned char  -> %hi\n", *( ( unsigned char* )l_Just4Bytes ) );

// 10111101 as a 2'S COMPLEMENT number equals -67
printf( "l_Just4Bytes as signed char    -> %i\n", *( ( signed char* )l_Just4Bytes ) );

unsigned short et short

// 1011110110111101 as a PLAIN BINARY number equals 48573
printf( "l_Just4Bytes as unsigned short -> %hu\n", *( ( unsigned short* )l_Just4Bytes ) );

// 1011110110111101 as a 2'S COMPLEMENT number equals -16963
printf( "l_Just4Bytes as short          -> %hi\n", *( ( short* )l_Just4Bytes ) );

unsigned int, int et float

// 10111101101111011011110110111101 as a PLAIN BINARY number equals 3183328701
printf( "l_Just4Bytes as unsigned int   -> %u\n", *( ( unsigned int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a 2'S COMPLEMENT number equals -1111638595
printf( "l_Just4Bytes as int            -> %i\n", *( ( int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a IEEE 754 SINGLE-PRECISION number equals -0.092647
printf( "l_Just4Bytes as float          -> %f\n", *( ( float* )l_Just4Bytes ) );

Les 4 octets dans la RAM (l_Just4Bytes[ 0..3 ]) restent toujours exactement les mêmes. La seule chose qui change est la façon dont nous les interprétons.

Encore une fois, nous dire le système comment pour les interpréter par types .

Par exemple, ci-dessus, nous avons utilisé les types suivants pour interpréter le contenu du tableau de l_Just4Bytes

  • unsigned char: 1 octet en binaire simple
  • signed char: 1 octet en complément de 2
  • unsigned short: 2 octets en notation binaire simple
  • short: 2 octets en complément de 2
  • unsigned int: 4 octets en notation binaire simple
  • int: 4 octets en complément de 2
  • float: 4 octets IEEE 754 notation simple précision

[EDIT] Ce message a été modifié après le commentaire par user4581301. Merci d'avoir pris le temps de laisser tomber ces quelques lignes utiles!

Vous pouvez regarder le professeur Jerry Cain de Stanford expliquant le complément à deux, dans la deuxième lecture (l'explication concernant le complément de 2 commence vers 13h00) dans la série de conférences appelées Paradigmes de programmation disponible pour regarder de la chaîne YouTube de Standford. Voici le lien vers la série de conférences: http://www.youtube.com/view_play_list?p= 9D558D49CA734A02 .

Le complément à deux est utilisé car il est plus simple à mettre en œuvre dans les circuits et ne permet pas un zéro négatif.

S'il y a x bits, le complément à deux vont de + (2 ^ x / 2 + 1) - (2 ^ x / 2). Un complément à se déroulera de + (2 ^ x / 2) -. (2 ^ x / 2), mais permette un zéro négatif (0000 est égal à 1000 dans un système de complément à 4 bit 1)

Eh bien, votre intention est pas vraiment à inverser tous les bits de votre nombre binaire. Il est en fait de soustraire chacun son chiffre de 1. Il est juste une heureuse coïncidence que soustraire 1 de 1 résultats en 0 et en soustrayant 0 de 1 résultats en 1. Donc flipping bits est effectivement mène cette soustraction.

Mais pourquoi vous trouvez la différence de chaque chiffre de 1? Eh bien, vous n'êtes pas. Votre intention réelle est de calculer la différence de nombre binaire donné d'un autre nombre binaire qui a le même nombre de chiffres, mais ne contient que des 1. Par exemple, si votre numéro est 10110001, lorsque vous retournez tous ces bits, vous calculer statiquement. (11111111 à 10110001)

Ceci explique la première étape dans le calcul de l'effectif de deux. Maintenant, nous allons inclure la deuxième étape - l'ajout de 1 -. Aussi dans l'image

Ajouter une à l'équation binaire ci-dessus:

11111111 à 10110001 + 1

Qu'est-ce que vous obtenez? Ceci:

100000000-10110001

Ceci est l'équation finale. Et en effectuant ces deux étapes que vous essayez de trouver ce, dernière différence:. Le nombre binaire soustrait d'un autre nombre binaire avec un chiffre supplémentaire et contenant des zéros, sauf à la position de bit signification

Mais pourquoi sommes-nous hankerin après cette différence vraiment? Eh bien, à partir de là, je pense que ce serait mieux si vous lisez le Wikipedia article .

Nous effectuons seule opération d'addition à la fois l'addition et la soustraction. Nous ajoutons le second opérande au premier opérande d'addition. Pour la soustraction, nous ajoutons le complément de 2 du second opérande au premier opérande.

Avec une représentation du complément de 2, nous ne avons pas besoin de composants numériques séparés pour sommateurs et complementers soustraction seulement sont utilisés.

Il vaut la peine de noter que sur quelques premières machines à additionner, avant que les jours d'ordinateurs numériques, la soustraction serait effectuée en ayant l'opérateur d'entrer des valeurs en utilisant un ensemble de couleur différente des légendes sur chaque touche (pour chaque touche entrerait neuf moins la nombre à soustraire), et appuyer sur un bouton spécial supposerait une retenue dans le calcul. Ainsi, sur une machine à six chiffres, soustraire 1234 d'une valeur, l'opérateur frapperait les clés qui normalement indiquer « 998765 » et appuyez sur un bouton pour ajouter cette valeur, plus un pour le calcul en cours. arithmétique de complément à deux est tout simplement l'équivalent binaire de l'arithmétique que précédemment « ten's-complément ».

L'avantage d'effectuer la soustraction par la méthode du complément est la réduction du matériel
complexity.The sont pas besoin de différents circuits numériques pour l'addition et subtraction.both  addition et de soustraction sont effectuées par un additionneur seulement.

Un avantage majeur de la représentation en complément à deux qui n'a pas été encore mentionné ici est que les bits inférieurs d'une somme en complément à deux, la différence, ou d'un produit dépendent uniquement sur les bits correspondants de les opérandes. La raison pour laquelle la valeur signée de 8 bits pour -1 est 11111111 est que la soustraction any entier dont les plus bas 8 bits sont 00000001 de tout autre nombre entier dont la plus basse 8 bits sont 0000000 permettra d'obtenir un nombre entier dont les 8 bits inférieurs sont 11111111. Mathématiquement, la valeur -1 serait une chaîne infinie de de 1, mais toutes les valeurs dans la plage d'un type entier particulier sera soit tous des 1 ou tous les 0 passé un certain point, il est donc pratique pour les ordinateurs de « signer-étendre » la bit le plus significatif d'un nombre comme si elle représentait un nombre infini de 1 ou de 0..

en complément à deux est à peu près la seule représentation nombre signé qui fonctionne bien lorsqu'ils traitent avec des types plus grands qu'un mot naturel machine binaire taille, puisque lors de l'exécution addition ou soustraction, le code peut récupérer le morceau le plus bas de chaque opérande, calculer la le plus bas morceau du résultat, et le magasin qui, puis chargez le morceau suivant de chaque opérande, calculer le prochain morceau du résultat, et magasin qui, etc. Ainsi, même un processeur qui exige que tous les ajouts et soustractions à passer par un seul 8 registre peut gérer 32 bits bits des nombres signés raisonnablement efficace (plus lent que d'un registre 32 bits, bien sûr, mais encore réalisable).

Lors de l'utilisation des toutes les autres représentations signées autorisées par la norme C, chaque bit du résultat pourrait être affecté par un peu des opérandes, ce qui rend nécessaire soit maintenir une valeur entière dans les registres à la fois ou suivre les autres calculs avec une étape supplémentaire qui, au moins dans certains cas, exiger la lecture, la modification et la réécriture de chaque morceau du résultat.

Une réponse satisfaisante des raisons pour lesquelles la Complement de Two2 est utilisé pour représenter les nombres négatifs plutôt que le système de Complement de première est que                         Le système Complement de deux résout le problème de plusieurs représentations de 0 et la nécessité de fin autour-porter qui existent dans le système de complément L'un des représentant des nombres négatifs.

Pour plus d'informations Visitez https://en.wikipedia.org/wiki/Signed_number_representations

Pour fin autour de carry Visitez https://en.wikipedia.org/wiki/End-around_carry

parce que les fabricants de CPU sont paresseux!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top