Quels sont les avantages de Two's Complement?

11

Dans certains appareils ADC / DAC, il existe des options pour sortir / entrer les données sous la forme Complément de 2.

Quels sont les avantages de représenter des données numériques dans le formulaire Complément de deux? Lorsque vous pouvez simplement avoir un code binaire simple et gagner du temps de conversion?

rahulb
la source
4
Le compliment de Two est un code binaire direct ...
Mooing Duck
«L'algèbre est exécutée sur une machine (l'univers) qui est un complément à deux» - HAKMEM 154 ( inwap.com/pdp10/hbaker/hakmem/hacks.html )
ChrisInEdmonton
2
Qu'est-ce que le complément 5 sur deux? 101. Qu'est-ce que 5 en code binaire droit? 101. Qu'est-ce que -5 en complément à deux? 1 ... 11111011. Qu'est-ce que -5 en code binaire direct? Euh ...
user253751
Cela semble être un cas spécial rare d'avoir un ADC avec une sortie négative? Qu'est-ce que cela signifie même, que la tension mesurée est inférieure à la tension de référence basse? Et comment construiriez-vous un tel ADC? Approximation successive avec des bouchons à charge négative ...?
Lundin
Notez qu'il existe deux mots différents , complEment et complIment . Le sujet ici est le complément à deux , même si ces deux sont très polis et disent souvent de bonnes choses à votre sujet.
Pete Becker

Réponses:

11

La représentation du complément à deux d'entiers signés est facile à manipuler dans le matériel. Par exemple, la négation (c'est-à-dire x = -x ) peut être effectuée simplement en retournant tous les bits du nombre et en en ajoutant un. Effectuer la même opération en binaire brut (par exemple avec un bit de signe) implique généralement beaucoup plus de travail, car vous devez traiter certains bits du flux comme spéciaux. Il en va de même pour l'ajout - l'opération d'ajout pour les nombres négatifs est identique à l'opération d'ajout pour les nombres positifs, donc aucune logique supplémentaire (sans jeu de mots) n'est requise pour gérer le cas négatif.

Bien que cela ne signifie pas que c'est plus facile de votre point de vue, en tant que consommateur de ces données, cela diminue l'effort de conception et la complexité de l'appareil, ce qui le rend probablement moins cher.

Polynôme
la source
1
Retourner les bits puis ajouter 1 pour annuler, non ??
Scott Seidman
2
@ScottSeidman Oui, désolé, j'ai oublié ce bit. Modifié pour corriger :)
Polynôme
1
En fait, pour un maximum de préparation, selon le processeur, cela peut prendre un seul cycle pour prendre x = x * -1, ou x = 0 - x , contre au moins deux cycles pour x = ~ x + 1
markt
@markt Oui, mais si vous n'implémentez qu'un périphérique minimal (c'est-à-dire pas un processeur complet), il est logique de réduire la complexité du silicium au strict minimum.
Polynôme
5
+1 De plus, le complément à deux n'a qu'une seule valeur pour 0. D'autres (comme le complément ou le bit de signe) finissent par en avoir deux
sbell
5

L'ADC peut convertir des données (disons des tensions d'entrée comprises entre 0 et 5 V) et vous devez soit que ces données ne soient pas signées (0 V = 0, 5 V = code max) ou signées (2,5 V = 0, 0 V = max -ve, 5 V = max + ve).

En plus du complément à 2 étant la représentation informatique la plus courante pour les données signées, la conversion entre les deux formats décrits ci-dessus est complètement triviale: inversez simplement le MSB!

C'est incroyablement bon marché à ajouter à la logique interne de l'ADC et donne à l'ADC un autre argument de vente sur la fiche technique ...

Brian Drummond
la source
Nous venons d'ajouter le commutateur MSB entre le complément à deux et le binaire offset comme commentaire ci
Scott Seidman
3

Si vous devez effectuer des calculs sur les représentations de nombres négatifs, le complément à deux rend cela plus facile que le décalage binaire, qui correspondra au type de données "int signé". Votre compilateur saura simplement comment y faire face. Sinon, vous passez des tics d'horloge à convertir dans les deux sens.

Scott Seidman
la source
1

Dans la question, il semble impliquer qu'il faut plus de temps à l'ADC pour renvoyer la valeur sous forme de complément à 2 qu'en binaire simple. Bien que cela puisse être le cas dans une implémentation particulière d'un ADC, ce n'est pas vrai en général (par exemple, la série de microcontrôleurs MSP430 a un périphérique ADC sur puce qui rapportera la valeur en binaire droit ou en complément à 2, mais il prend le même nombre de cycles dans les deux cas).

Avec cela à l'écart, le choix entre le complément à 2 et le binaire droit se résume principalement au fonctionnement de vos transducteurs et à la manière dont vous aimez traiter vos données.

En mode binaire droit, l'ADC vous donne un nombre qui représente le rapport entre la grandeur de la quantité analogique mesurée (presque toujours la tension) et la quantité de référence pleine échelle. Par exemple, un ADC 10 bits peut renvoyer des valeurs de 0 à 1023 (inclus). Si vous mesurez une tension (par exemple, 1,25 Volts) qui est la moitié de la tension de référence de l'ADC (par exemple, 2,50 Volts), le code binaire que vous lisez sera la moitié de la valeur maximale que vous pourriez lire - donc, 512, ou environ, sous réserve d'arrondi et de non-linéarités dans l'ADC.

Par exemple, supposons que vous ayez un transducteur qui signale la quantité de carburant de fusée dans un réservoir. 0 V signifie que le réservoir est vide et 2,5 V Volts signifie qu'il est plein. Il vous suffit donc de connecter le transducteur à votre ADC, et c'est parti!

Mais notez que dans le paragraphe ci-dessus, il n'y a aucun moyen de mesurer des tensions négatives. Et si nous voulions mesurer le débit de carburant de fusée dans et hors du réservoir (et nous avions un transducteur pour le faire)? L'ADC ne peut pas mesurer les nombres négatifs, nous avons donc un problème. Cependant, il existe un moyen facile de le simuler en utilisant le mode complément de 2: dans ce cas, la sortie du transducteur est recalculée de sorte que le point zéro soit à mi-chemin entre les deux tensions de référence de l'ADC. En d'autres termes, les flux positifs sont représentés par des tensions comprises entre 1,25 V et 2,50 V, et les flux négatifs sont représentés par 1,25 V à 0 V - donc les flux dans le réservoir donneront des codes ADC de 512 à 1023 et les flux sortant du remerciement donneront codes de 511 à 0 (en format binaire droit).

Maintenant, c'est terriblement gênant. Nous devons soustraire 512 de chaque mesure avant d'en faire quoi que ce soit, ce qui donne des nombres compris entre -512 et +511. Le point du mode complément de 2 est qu'il le fait pour vous!

Cependant, vous souhaiterez peut-être toujours utiliser le binaire droit avec un transducteur qui produit des résultats signés. Par exemple, votre transducteur peut avoir des sorties différentielles: dans ce cas, vous voudrez de toute façon soustraire la sortie inversée de la sortie non inversée, il n'y a donc aucun avantage à utiliser le complément à 2.

nick g
la source
1

Le système complémentaire des deux est utilisé, car il découle de la façon dont le matériel simple fonctionne naturellement. Pensez par exemple au compteur kilométrique de votre voiture, que vous avez remis à zéro. Ensuite, mettez la vitesse en marche arrière et roulez en arrière sur 1 mile (veuillez ne pas le faire en réalité). Votre compteur kilométrique (s'il est mécanique) roulera de 0000 à 9999. Le système de complément à deux se comporte de la même manière.

entrez la description de l'image ici


Veuillez noter que je n'offre pas vraiment de nouvelles informations ici, juste l'exemple du compteur kilométrique que quelqu'un pourrait trouver utile - cela m'a aidé à comprendre la raison d'être du système de complément à deux quand j'étais jeune. Après cela, il m'a été facile d'accepter intuitivement que les additionneurs, les soustracteurs, etc. fonctionnent bien avec le système de complément à deux.

Et oui, le compteur kilométrique de mon Nissan fonctionne de cette façon.

PkP
la source
Votre réponse concerne le débordement (et le sous-débordement), mais comme l'odomètre n'affiche pas de nombres négatifs, il ne traite rien du complément à deux ...
marcelm
@marcelm, En fait, l'exemple du compteur kilométrique n'explique complément à deux. C'est juste que PkP n'est pas allé assez loin dans l'explication. Si un odomètre à six chiffres indique zéro et que vous conduisez en marche arrière sur un mile, vous vous attendez à ce qu'il indique -1. Au lieu de cela, il lit 999999. C'est parce que 999999 est la représentation du complément à six chiffres et dizaines de -1.
Solomon Slow
@jameslarge Non, ce n'est toujours pas le cas. Il n'y a rien dans la réponse qui touche réellement le complément à deux. Ou son complément, ou amplitude du signe, ou toute représentation numérique signée.
marcelm
@marcelm Oui, il y a: l'idée même du système du complément à deux: que zéro moins un est égal au nombre entier non signé représentable maximum. C'est l'idée d'un système de complément à deux. Aucune autre représentation numérique signée ne propose cela (à ma connaissance). Et l'exemple du compteur kilométrique montre à quel point cette propriété comportementale provient naturellement de la simplicité de l'ingénierie; dans le cas du compteur kilométrique: de la construction mécanique. Dans le monde mécanique et électronique, il (le système de complément à deux) est le moyen le plus simple de le faire fonctionner.
PkP
0

D'autres ont déjà expliqué pourquoi deux compliments binaires sont pratiques pour le matériel informatique. Cependant, vous semblez demander pourquoi un A / D produirait deux compliments au lieu de "binaire direct" (quoi que vous pensiez que cela signifie vraiment).

La plupart des A / D affichent une simple valeur binaire non signée allant de 0 à 2 N -1, où N est le nombre de bits vers lesquels l'A / D se convertit. Notez que cela pourrait également être considéré comme une notation complimentaire à deux, juste que les valeurs ne sont jamais négatives. Si vous ne traitez qu'avec des nombres positifs, la plupart des représentations binaires sont les mêmes. Cela comprend deux compliments et une amplitude de signe.

Certains A / N, en particulier ceux intégrés aux microcontrôleurs, ont la possibilité de produire des valeurs négatives pour la moitié inférieure de leur plage. Cela peut être un avantage perçu lors de la mesure d'un signal bipolaire.

Au moins dans un microcontrôleur, c'est généralement idiot. Dans certains cas, vous pouvez utiliser les valeurs A / D directement sans aucune conversion. Dans ce cas, vous avez déjà converti toutes les autres valeurs dans la plage A / D. Restreindre cela à tous les nombres non négatifs simplifie en fait les choses.

Sinon, vous allez quand même appliquer une certaine mise à l'échelle et un décalage aux lectures A / N pour les insérer dans les unités que vous utilisez pour les valeurs en interne. Là encore, il n'y a pas d'inconvénient à ce que les valeurs non signées sortent directement de l'A / D. En fait, j'applique généralement un filtrage passe-bas sur les valeurs brutes avant toute mise à l'échelle et décalage. La connaissance de ces valeurs ne sera jamais négative simplifie légèrement les calculs. Faire la mise à l'échelle sur des valeurs non signées rend parfois les choses un peu plus simples.

Je ne me souviens pas d'un seul cas dans plus de 100 projets de microcontrôleurs où j'ai utilisé l'A / D dans un format de sortie autre que non signé.

Donc, pour répondre à la question de savoir quels sont les avantages d'un A / N produisant un "compliment à deux", il y a deux réponses:

  1. Ils le font tous de toute façon, juste que la plupart du temps, ces valeurs sont non négatives, donc vous ne pouvez pas faire la différence entre deux compliments et d'autres notations, comme la magnitude des signes.

  2. Les avantages sont très faibles. À l'intérieur d'un microcontrôleur, ils sont essentiellement inexistants.

    Dans le matériel dédié, il peut être avantageux d'avoir des valeurs négatives indiquant une tension d'entrée négative, auquel cas deux compliments sont le moyen le plus simple de gérer la plage de valeurs. Notez que si la plage de tension d'entrée n'est pas symétrique autour de 0, cet avantage disparaît.

Olin Lathrop
la source
-1

Quel est ce «code binaire direct» dont vous parlez? Je suppose que vous voulez dire avoir un bit de signe qui est «1» pour négatif et «0» pour positif (ou vice-versa ). Cela présente deux autres inconvénients par rapport à deux compléments qui n'ont pas encore été mentionnés: un largement hors de propos de nos jours et un important.

Le plus non pertinent est que vous pouvez représenter un nombre de moins - soit 255 nombres en 8 bits. Ce n'est pas pertinent lorsque vous avez 32 ou 64 bits, mais cela comptait lorsque vous n'aviez que 4 ou 6 bits pour travailler.

Le plus important est qu'il y a maintenant deux façons de représenter le même nombre - spécifiquement, 0 - +0 et -0 mais +0 et -0 sont le même nombre, donc votre implémentation doit s'assurer que vous ne les comparez pas chaque fois que vous effectuez une vérification d'égalité.

Jack Aidley
la source
Je pense que vous êtes hors piste ici. Vous parlez d'une représentation de la grandeur du signe lorsque l'OP parlait assez clairement d'une représentation binaire non signée.
Joe Hass
1
Si vous parlez d'une représentation non signée, le complément à deux n'a aucun avantage. Cela gaspille simplement un peu.
Jack Aidley