Je suis juste curieux de savoir s'il y a une raison pour laquelle pour représenter -1 en binaire, le complément à deux est utilisé: retourner les bits et ajouter 1?
-1 est représenté par 11111111 (complément à deux) plutôt que (pour moi plus intuitif) 10000001 qui est binaire 1 avec le premier bit comme drapeau négatif.
Avertissement: je ne compte pas sur l'arithmétique binaire pour mon travail!
Réponses:
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
et1001
, respectivement (je m'en tiens à 4 bits pour la taille). À la manière du complément à deux , ils sont0010
et1111
. 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:
0001
est 1, ce qui est le résultat attendu de "2 + (- 1)".Mais dans votre méthode "intuitive", l'ajout est plus compliqué:
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:
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:
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:
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.
la source
how we arrived at 2s compliment the first place.
cs.cornell.edu/~tomf/notes/cps104/twoscomp.html1
indique-8
, et les trois autres1
s indiquent4
,2
et1
, respectivement, de sorte-8+4+2+1 = -1
.Wikipedia dit tout:
En d'autres termes, l'ajout est le même, que le nombre soit négatif ou non.
la source
Même si cette question est ancienne, permettez-moi de mettre mes 2 cents.
Avant d'expliquer cela, revenons à l'essentiel. Le complément 2 'est le complément 1 + 1. Maintenant, quel est le complément de 1 et quelle est sa signification en plus.
La somme de n'importe quel nombre de n bits et son complément à 1 vous donne le nombre le plus élevé possible qui peut être représenté par ces n bits. Exemple:
Maintenant, que se passera-t-il si nous essayons d'ajouter 1 de plus au résultat. Il en résultera un débordement.
Le résultat sera
1 0000
qui est 0 (comme nous travaillons avec des nombres à 4 bits, (le 1 à gauche est un débordement)Alors ,
Quelqu'un a alors décidé d'appeler le complément 1 + 1 comme complément 2 '. Ainsi, l'énoncé ci-dessus devient: Tout nombre n'bit + son complément à 2 = 0, ce qui signifie le complément à 2 d'un nombre = - (de ce nombre)
Tout cela nous amène à une autre question, pourquoi pouvons-nous utiliser uniquement le (n-1) des n bits pour représenter un nombre positif et pourquoi le nième bit le plus à gauche représente-t-il le signe (0 sur le bit le plus à gauche signifie + nombre ve, et 1 signifie -ve numéro). Par exemple, pourquoi utilisons-nous uniquement les 31 premiers bits d'un int en java pour représenter un nombre positif si le 32e bit est 1, son nombre ave.
1 0000 (le résultat est zéro, avec le carry 1 débordant)
Ainsi le système de (n + 2 'complément de n) = 0, fonctionne toujours. La seule ambiguïté est ici le complément à 2 de 12 est 0100 qui représente également de manière ambiguë +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 un 0 dans leur bit le plus à gauche. Dans ce cas, leur complément à 2 aura toujours un 1 dans leur bit le plus à gauche, et nous n'aurons pas l'ambiguïté du même ensemble de bits représentant un numéro de complément à 2 ainsi qu'un nombre + ve.
la source
Le complément à deux permet de faire l'addition et la soustraction de la manière normale (comme si vous enrouliez pour des nombres non signés). Il empêche également -0 (une manière distincte de représenter 0 qui ne serait pas égale à 0 avec la méthode normale de comparaison bit par bit).
la source
il s'agit de simplifier les sommes et les différences de nombres. une somme d'un nombre négatif et d'un positif codifié dans les compléments de 2 équivaut à les résumer normalement.
la source
L'implémentation habituelle de l'opération est de «retourner les bits et d'ajouter 1», mais il existe une autre façon de la définir qui rend probablement la justification plus claire. Le complément de 2 est la forme que vous obtenez si vous prenez la représentation non signée habituelle où chaque bit contrôle la puissance suivante de 2, et rend juste le terme le plus significatif négatif.
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 binaire non signée habituelle 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 = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255
L'interprétation du complément à deux 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 = -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1
Aucun des autres bits ne change la signification du tout, et le transfert dans un 7 est un "débordement" et ne devrait pas fonctionner, donc presque toutes les opérations arithmétiques fonctionnent sans modification (comme d'autres l'ont noté). La grandeur de signe inspecte généralement le bit de signe et utilise une logique différente.
la source
Le complément à deux permet d'additionner des nombres négatifs et positifs 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)
Il en va de même pour la soustraction.
De plus, si vous essayez de soustraire 4 de 6 (deux nombres positifs), vous pouvez compléter 2 à 4 et additionner les deux ensemble 6 + (-4) = 6 - 4 = 2
Cela signifie que la soustraction et l'ajout de nombres positifs et négatifs peuvent tous être effectués par le même circuit dans le processeur.
la source
Pour développer d'autres réponses:
En complément à deux
La division nécessite un mécanisme différent.
Tout cela est vrai parce que le complément à deux est juste une arithmétique modulaire normale, où nous choisissons de regarder certains nombres comme négatifs en soustrayant le modulo.
la source
unsigned mul(unsigned short x, unsigned short y) { return x*y; }
[16 bits court; 32 bits int] générera occasionnellement du code qui fonctionnera mal si le produit est plus grand que 2147483647.En lisant les réponses à cette question, je suis tombé sur ce commentaire [édité].
À mon avis, la question posée dans ce commentaire est assez intéressante et je voudrais donc tout d'abord la reformuler et ensuite fournir une réponse et un exemple.
QUESTION - Comment le système peut-il déterminer comment interpréter un ou plusieurs octets adjacents? En particulier, comment le système peut-il établir si une séquence d'octets donnée est un nombre binaire simple ou un complément à 2?
REPONSE - Le système établit comment interpréter une séquence d'octets à travers les types. Les types définissent
EXEMPLE - Ci-dessous, nous supposons que
char
mesurent 1 octet de longshort
mesurent 2 octetsint
'etfloat
' ont une longueur de 4 octetsVeuillez noter que ces tailles sont spécifiques à mon système. Bien qu'ils soient assez courants, ils peuvent être différents d'un système à l'autre. Si vous êtes curieux de savoir ce qu'ils sont sur votre système, utilisez l' opérateur sizeof .
Tout d'abord, nous définissons un tableau contenant 4 octets et les initialisons tous au nombre binaire
10111101
, correspondant au nombre hexadécimalBD
.Ensuite, nous lisons le contenu du tableau en utilisant différents types.
unsigned char
etsigned char
unsigned short
etshort
unsigned int
,int
etfloat
Les 4 octets de RAM (
l_Just4Bytes[ 0..3 ]
) restent toujours les mêmes. La seule chose qui change, c'est la façon dont nous les interprétons.Encore une fois, nous expliquons au système comment les interpréter à l'aide de types .
Par exemple, ci-dessus, nous avons utilisé les types suivants pour interpréter le contenu du
l_Just4Bytes
tableauunsigned char
: 1 octet en binaire ordinairesigned char
: 1 octet en complément à 2unsigned short
: 2 octets en notation binaire simpleshort
: 2 octets en complément à 2unsigned int
: 4 octets en notation binaire simpleint
: 4 octets en complément à 2float
: 4 octets en notation simple précision IEEE 754[MODIFIER] Ce message a été modifié après le commentaire de user4581301. Merci d'avoir pris le temps de laisser tomber ces quelques lignes utiles!
la source
int x = -4
, et je fais alorsprintf("%d" , x)
comment est-il interprété? Quelle est également la différence entreunsigned int
etsigned int
et%d
et%u
... cela me dérange depuis longtemps maintenant. Merci.int
types, lesigned
modificateur est par défaut. Cela signifie queint
etsigned int
sont exactement du même type. D'où les deux définitionsint i = -4;
etsigned int i = -4;
ont la même signification.int
est de 4 octets en complément de 2 et ununsigned int
est de 4 octets en notation binaire simple (vérifiez la taille réelle du type sur votre système à l'aide de l'sizeof
opérateur).Vous pouvez regarder le professeur Jerry Cain de Stanford expliquer le complément à deux, dans la deuxième conférence (l'explication concernant le complément à 2 commence vers 13h00) dans la série de conférences intitulée Programming Paradigms disponibles à regarder sur 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 .
la source
Le complément à deux est utilisé car il est plus simple à mettre en œuvre dans les circuits et ne permet pas non plus un zéro négatif.
S'il y a x bits, le complément à deux va de + (2 ^ x / 2 + 1) à - (2 ^ x / 2). Le complément de l'un s'exécutera de + (2 ^ x / 2) à - (2 ^ x / 2), mais permettra un zéro négatif (0000 est égal à 1000 dans un système de complément à 4 bits 1).
la source
Eh bien, votre intention n'est pas vraiment d'inverser tous les bits de votre nombre binaire. Il s'agit en fait de soustraire chacun son chiffre de 1. C'est juste une heureuse coïncidence que la soustraction de 1 de 1 donne 0 et de la soustraction de 0 de 1.
Mais pourquoi trouvez-vous la différence de chaque chiffre par rapport à 1? Eh bien non. Votre intention réelle est de calculer la différence du nombre binaire donné à partir 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 calculez efficacement (11111111 - 10110001).
Cela explique la première étape du calcul du complément à deux. Maintenant, incluons la deuxième étape - ajouter 1 - également dans l'image.
Ajoutez 1 à l'équation binaire ci-dessus:
11111111 - 10110001 + 1
Qu'est ce que tu obtiens? Ce:
100000000 - 10110001
Ceci est l'équation finale. Et en effectuant ces deux étapes, vous essayez de trouver cela, 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 la plus significative.
Mais pourquoi voulons-nous vraiment après cette différence? Eh bien, à partir d'ici, je pense que ce serait mieux si vous lisiez l'article Wikipedia .
la source
Nous effectuons uniquement une opération d'addition pour l'addition et la soustraction. Nous ajoutons le deuxième opérande au premier opérande pour l'addition. Pour la soustraction, nous ajoutons le complément à 2 du deuxième opérande au premier opérande.
Avec une représentation du complément à 2, nous n'avons pas besoin de composants numériques séparés pour la soustraction - seuls des additionneurs et des complémenteurs sont utilisés.
la source
Il convient de noter que sur certaines machines à ajouter tôt, avant l'époque des ordinateurs numériques, la soustraction serait effectuée en demandant à l'opérateur d'entrer des valeurs en utilisant un jeu de légendes de couleur différente sur chaque touche (de sorte que chaque touche entrerait neuf moins le nombre à être soustrait), et appuyer sur un bouton spécial supposerait un report dans un calcul. Ainsi, sur une machine à six chiffres, pour soustraire 1234 d'une valeur, l'opérateur frappait des touches qui indiquaient normalement "998 765" et appuyait sur un bouton pour ajouter cette valeur plus une au calcul en cours. L'arithmétique du complément à deux est simplement l'équivalent binaire de l'arithmétique antérieure du "complément à dix".
la source
L'avantage d'effectuer la soustraction par la méthode du complément est la réduction de la
complexité matérielle. Les différents circuits numériques ne sont pas nécessaires pour l'addition et la soustraction. L'addition et la soustraction sont effectuées par l'additionneur uniquement.
la source
Un avantage majeur de la représentation en complément à deux qui n'a pas encore été mentionné ici est que les bits inférieurs d'une somme, d'une différence ou d'un produit à complément à deux ne dépendent que des bits correspondants des opérandes. La raison pour laquelle la valeur signée sur 8 bits pour -1 est
11111111
que la soustraction de tout entier dont les 8 bits les plus bas sont00000001
de tout autre entier dont les 8 bits les plus bas0000000
donnera un entier dont les 8 bits les plus bas sont11111111
. Mathématiquement, la valeur -1 serait une chaîne infinie de 1, mais toutes les valeurs dans la plage d'un type entier particulier seront soit toutes les 1 soit toutes les 0 après un certain point, il est donc pratique pour les ordinateurs de "prolonger par signe" le bit le plus significatif d'un nombre comme s'il représentait un nombre infini de 1 ou de 0.Le complément à deux est à peu près la seule représentation de nombre signé qui fonctionne bien lorsque l'on traite des types plus grands que la taille naturelle d'un mot d'une machine binaire, car lors de l'addition ou de la soustraction, le code peut extraire le bloc le plus bas de chaque opérande, calculer le bloc le plus bas de le résultat et le stocker, puis charger le morceau suivant de chaque opérande, calculer le morceau suivant du résultat et le stocker, etc. Ainsi, même un processeur qui nécessite tous les ajouts et soustractions pour passer par un seul registre 8 bits peut gérer les numéros signés 32 bits de manière raisonnablement efficace (plus lent qu'avec un registre 32 bits, bien sûr, mais toujours utilisable).
Lors de l'utilisation de toute autre représentation signée autorisée par la norme C, chaque bit du résultat pourrait potentiellement être affecté par n'importe quel bit des opérandes, ce qui oblige à conserver une valeur entière dans les registres à la fois ou à suivre les calculs avec un supplément étape qui, dans certains cas au moins, nécessiterait la lecture, la modification et la réécriture de chaque bloc du résultat.
la source
Il existe différents types de représentations:
-Représentation du nombre non signé utilisé pour représenter uniquement les nombres positifs
-La représentation numérique signée sert à représenter un nombre positif aussi bien qu'un nombre négatif. Dans la représentation du nombre signé, le bit MSB représente le bit de signe et les bits de repos représentent le nombre. Lorsque MSB est 0, le nombre est positif et lorsque MSB est 1, le nombre est négatif.
Le problème avec la représentation des nombres signés est qu'il y a deux valeurs pour 0.
Le problème avec la représentation du complément est qu'il y a deux valeurs pour 0.
Mais si nous utilisons la représentation du complément à deux, il n'y aura qu'une seule valeur pour 0, c'est pourquoi nous représentons des nombres négatifs sous forme de complément à deux.
Source: pourquoi les nombres négatifs sont stockés sous forme de complément de deux octets de gigaoctets
la source
Une réponse satisfaisante de la raison pour laquelle le complément de Two2 est utilisé pour représenter des nombres négatifs plutôt que le système de complément de One est que le système de complément de Two résout le problème des représentations multiples de 0 et le besoin de report qui existe dans le système de complément de One pour représenter le négatif Nombres.
Pour plus d'informations, visitez https://en.wikipedia.org/wiki/Signed_number_representations
Pour la fin du tour, visitez https://en.wikipedia.org/wiki/End-around_carry
la source