Was sind die Vorteile von Two's Complement?

11

In einigen ADC / DAC-Geräten gibt es Optionen zum Ausgeben / Eingeben der Daten in der 2er-Komplementform.

Was sind die Vorteile der Darstellung digitaler Daten in Two's Complement-Form? Wenn Sie einfach einen reinen Binärcode haben und Zeit für die Konvertierung sparen können?

rahulb
quelle
4
Das Kompliment von Two ist ein
direkter
"Algebra wird auf einer Maschine (dem Universum) ausgeführt, die sich aus zwei Personen zusammensetzt" - HAKMEM 154 ( inwap.com/pdp10/hbaker/hakmem/hacks.html )
ChrisInEdmonton,
2
Was ist 5 in Zweierkomplement? 101. Was ist 5 im geraden Binärcode? 101. Was ist -5 in Zweierkomplement? 1 ... 11111011. Was ist -5 in reinem Binärcode? Uhh ...
user253751
Es scheint ein seltener Sonderfall zu sein, einen ADC mit negativem Ausgang zu haben? Was bedeutet das überhaupt, dass die gemessene Spannung niedriger ist als die Referenz für niedrige Spannung? Und wie würden Sie einen solchen ADC bauen? Sukzessive Approximation mit Kappen, die eine negative Last haben ...?
Lundin
Beachten Sie, dass es zwei verschiedene Wörter gibt: ComplEment und ComplIment . Das Thema hier ist die Ergänzung von zwei , auch wenn diese beiden sehr höflich sind und oft nette Dinge über dich sagen.
Pete Becker

Antworten:

11

Die Komplimentdarstellung von vorzeichenbehafteten Ganzzahlen durch Two ist in der Hardware leicht zu manipulieren. Zum Beispiel kann die Negation (dh x = -x ) einfach durchgeführt werden, indem alle Bits in der Zahl umgedreht und eins hinzugefügt werden. Das Ausführen derselben Operation in einer rohen Binärdatei (z. B. mit einem Vorzeichenbit) erfordert normalerweise viel mehr Arbeit, da Sie bestimmte Bits im Stream als speziell behandeln müssen. Gleiches gilt für die Addition - die Additionsoperation für negative Zahlen ist identisch mit der Additionsoperation für positive Zahlen, sodass keine zusätzliche Logik (kein Wortspiel beabsichtigt) erforderlich ist, um den negativen Fall zu behandeln.

Dies bedeutet zwar nicht, dass es aus Ihrer Sicht einfacher ist, als Verbraucher dieser Daten, aber es verringert den Designaufwand und die Komplexität des Geräts und macht es vermutlich billiger.

Polynom
quelle
1
Umdrehen von Bits und Hinzufügen von 1 zum Negieren, nein?
Scott Seidman
2
@ ScottSeidman Ja, sorry, ich habe das bisschen vergessen. Bearbeitet, um zu beheben :)
Polynom
1
Eigentlich für maximale pickiness, abhängig von dem Prozessor kann es sich um ein Einzelzyklus sein , nehmen x = x * -1, oder x = 0 - x , im Vergleich zu mindestens zwei Zyklen für x = ~ x + 1
Markt
@markt Ja, aber wenn Sie nur ein minimales Gerät (dh keinen vollständigen Prozessor) implementieren, ist es sinnvoll, die Komplexität des Siliziums auf ein Minimum zu reduzieren.
Polynom
5
+1 Außerdem hat das Zweierkomplement nur einen einzigen Wert für 0. Andere (wie das eigene Komplement oder das Vorzeichenbit) haben
am
5

Der ADC kann Daten konvertieren (z. B. Eingangsspannungen zwischen 0 und 5 V), und Sie müssen diese Daten entweder vorzeichenlos (0 V = 0, 5 V = maximaler Code) oder signiert (2,5 V = 0, 0 V = max -ve, 5 V = max + ve).

Zusätzlich zur Ergänzung von 2 als häufigste Computerdarstellung für signierte Daten ist die Konvertierung zwischen den beiden oben beschriebenen Formaten völlig trivial: Invertieren Sie einfach das MSB!

Dies ist unglaublich billig, um die interne Logik des ADC zu erweitern, und gibt dem ADC ein weiteres Verkaufsargument auf dem Datenblatt ...

Brian Drummond
quelle
Scott Seidman
3

Wenn Sie die Darstellungen negativer Zahlen berechnen müssen, ist das Zweierkomplement einfacher als die Offset-Binärdatei, die mit dem Datentyp "signiertes int" übereinstimmt. Ihr Compiler weiß einfach, wie er damit umgehen soll. Andernfalls verbringen Sie Clock Ticks damit, hin und her zu konvertieren.

Scott Seidman
quelle
1

In der Frage scheint impliziert zu sein, dass es länger dauert, bis der ADC den Wert in der Komplementform von 2 zurückgibt als in der geraden Binärform. Während dies bei einer bestimmten Implementierung eines ADC der Fall sein kann, trifft dies im Allgemeinen nicht zu (zum Beispiel hat die MSP430-Serie von Mikrocontrollern einen ADC-Peripherie-On-Chip, der den Wert in gerader Binär- oder Zweierkomplement anzeigt, aber es dauert in beiden Fällen die gleiche Anzahl von Zyklen).

Damit hängt die Wahl zwischen dem 2er-Komplement und der geraden Binärdatei hauptsächlich davon ab, wie Ihre Wandler funktionieren und wie Sie Ihre Daten verarbeiten möchten.

Im geraden Binärmodus gibt Ihnen der ADC eine Zahl, die das Verhältnis zwischen der Größe der gemessenen Analoggröße (praktisch immer Spannung) und der Referenzgröße im vollen Maßstab darstellt. Beispielsweise kann ein 10-Bit-ADC Werte von 0 bis einschließlich 1023 zurückgeben. Wenn Sie eine Spannung messen (z. B. 1,25 Volt), die der Hälfte der Referenzspannung des ADC entspricht (z. B. 2,50 Volt), entspricht der von Ihnen gelesene Binärcode der Hälfte des Maximalwerts, den Sie lesen können - also etwa 512 Volt. vorbehaltlich Rundungen und Nichtlinearitäten im ADC.

Angenommen, Sie haben einen Schallkopf, der die Menge an Raketentreibstoff in einem Tank anzeigt. 0 V bedeutet, dass der Tank leer ist und 2,5 V Volt bedeuten, dass er voll ist. Sie schließen also einfach den Schallkopf an Ihren ADC an und los geht's!

Beachten Sie jedoch, dass es im obigen Absatz keine Möglichkeit gibt, negative Spannungen zu messen. Was wäre, wenn wir den Fluss von Raketentreibstoff in den Tank und aus dem Tank messen wollten (und wir hatten dazu einen Schallkopf)? Der ADC kann keine negativen Zahlen messen, daher haben wir ein Problem. Es gibt jedoch eine einfache Möglichkeit, es im Komplement-Modus von 2 zu fälschen: In diesem Fall wird der Wandlerausgang neu vorgespannt, sodass der Nullpunkt auf halbem Weg zwischen den beiden Referenzspannungen des ADC liegt. Mit anderen Worten, positive Flüsse werden durch Spannungen zwischen 1,25 V und 2,50 V dargestellt, und negative Flüsse werden durch 1,25 V bis 0 V dargestellt. Ströme in den Tank ergeben also ADC-Codes von 512 bis 1023 und Ströme aus dem Dankeschön geben Codes von 511 bis 0 (im geraden Binärformat).

Das ist furchtbar unpraktisch. Wir müssen 512 von jeder Messung abziehen, bevor wir etwas damit machen, was Zahlen im Bereich von -512 bis +511 ergibt. Der Punkt des Komplement-Modus von 2 ist, dass er dies für Sie erledigt!

Möglicherweise möchten Sie jedoch weiterhin eine reine Binärdatei mit einem Wandler verwenden, der signierte Ergebnisse liefert. Beispielsweise könnte Ihr Wandler über Differenzausgänge verfügen: In diesem Fall möchten Sie den invertierten Ausgang ohnehin vom nicht invertierten Ausgang subtrahieren, sodass die Verwendung des Zweierkomplements keinen Vorteil bietet.

Nick g
quelle
1

Das Komplementsystem der beiden wird verwendet, da es sich aus der natürlichen Funktionsweise einfacher Hardware ergibt. Denken Sie zum Beispiel an den Kilometerzähler Ihres Autos, den Sie auf Null zurückgesetzt haben. Schalten Sie dann den Rückwärtsgang ein und fahren Sie 1 Meile rückwärts (bitte tun Sie dies in der Realität nicht). Ihr Kilometerzähler (wenn er mechanisch ist) rollt von 0000 bis 9999. Das Komplementsystem der beiden verhält sich ähnlich.

Geben Sie hier die Bildbeschreibung ein


Bitte beachten Sie, dass ich hier keine neuen Informationen anbiete, sondern nur das Kilometerzähler-Beispiel, das jemand hilfreich finden könnte - es hat mir geholfen, die Gründe für das Zweierkomplementsystem zu verstehen, als ich jung war. Danach war es für mich leicht zu verstehen, dass Addierer, Subtrahierer usw. gut mit dem Komplementsystem der beiden funktionieren.

Und ja, der Kilometerzähler meines Nissan funktioniert so.

PkP
quelle
Ihre Antwort bezieht sich auf Überlauf (und Unterlauf), aber da der Kilometerzähler keine negativen Zahlen anzeigt, spricht er nichts an, was mit dem Komplement von zwei zu
tun hat
@marcelm, Eigentlich ist der Wegstreckenzähler Beispiel tut Zweierkomplement erklären. Es ist nur so, dass PkP mit der Erklärung nicht weit genug gegangen ist. Wenn ein sechsstelliger Kilometerzähler Null anzeigt und Sie eine Meile rückwärts fahren, würden Sie erwarten, dass er -1 anzeigt. Stattdessen wird 999999 angezeigt. Dies liegt daran, dass 999999 die sechsstellige Zehnerkomplementdarstellung von -1 ist.
Solomon Slow
@ Jameslarge Nein, das tut es immer noch nicht. Die Antwort enthält nichts, was das Zweierkomplement berührt. Oder das eigene Komplement oder die Vorzeichengröße oder eine vorzeichenbehaftete Zahlendarstellung.
Marcelm
@marcelm Ja, das gibt es: Die Kernidee des Zweierkomplementsystems: Null minus Eins entspricht der maximal darstellbaren vorzeichenlosen Ganzzahl. Das ist die Idee des Zweierkomplementsystems. Keine andere signierte Nummernrepräsentation bietet dies (meines Wissens). Und das Kilometerzähler-Beispiel zeigt, wie natürlich diese Verhaltenseigenschaft von der Einfachheit der Technik herrührt; im Falle des Kilometerzählers: aus dem Maschinenbau. Sowohl in der mechanischen als auch in der elektronischen Welt ist es (das Komplementsystem der beiden) der einfachste Weg, es zum Laufen zu bringen.
PkP
0

Andere haben bereits geantwortet, warum zwei Komplimente für Computerhardware praktisch sind. Sie scheinen sich jedoch zu fragen, warum ein A / D zwei Komplimente anstelle von "Straight Binary" ausgeben würde (was auch immer Sie denken, das bedeutet wirklich).

Die meisten A / Ds geben einen einfachen vorzeichenlosen Binärwert im Bereich von 0 bis 2 N -1 aus, wobei N die Anzahl der Bits ist, in die der A / D konvertiert. Beachten Sie, dass dies auch als Zweierkomplementnotation betrachtet werden kann, nur dass die Werte niemals negativ sind. Wenn Sie nur mit positiven Zahlen arbeiten, sind die meisten binären Darstellungen gleich. Dies beinhaltet zwei Komplimente und Vorzeichen.

Einige A / Ds, insbesondere solche, die in Mikrocontroller eingebaut sind, haben die Möglichkeit, negative Werte für die untere Hälfte ihres Bereichs zu erzeugen. Dies kann ein wahrgenommener Vorteil bei der Messung eines bipolaren Signals sein.

Zumindest in einem Mikrocontroller ist dies im Allgemeinen albern. In einigen Fällen können Sie die A / D-Werte direkt ohne Konvertierung verwenden. In diesem Fall haben Sie bereits alle anderen Werte in den A / D-Bereich konvertiert. Die Beschränkung auf alle nicht negativen Zahlen vereinfacht die Dinge tatsächlich.

Andernfalls werden Sie die A / D-Messwerte ohnehin skalieren und versetzen, um sie in die Einheiten zu bringen, die Sie intern für Werte verwenden. Auch hier gibt es keinen Nachteil für vorzeichenlose Werte, die direkt aus dem A / D kommen. Tatsächlich wende ich normalerweise vor jeder Skalierung und jedem Offset eine Tiefpassfilterung auf die Rohwerte an. Wenn Sie wissen, dass diese Werte niemals negativ sind, werden die Berechnungen geringfügig vereinfacht. Das Skalieren von vorzeichenlosen Werten macht die Dinge manchmal auch etwas einfacher.

Ich kann mich nicht an einen einzigen Fall in weit über 100 Mikrocontroller-Projekten erinnern, in denen ich A / D in einem anderen als einem nicht signierten Ausgabeformat verwendet habe.

Um die Frage zu beantworten, welche Vorteile eine A / D-Ausgabe mit "Zweierkompliment" bietet, gibt es zwei Antworten:

  1. Sie alle tun es trotzdem, nur dass diese Werte die meiste Zeit nicht negativ sind, so dass Sie den Unterschied zwischen zwei Komplimenten und anderen Notationen wie der Vorzeichengröße nicht erkennen können.

  2. Die Vorteile sind sehr gering. In einem Mikrocontroller sind sie im Wesentlichen nicht vorhanden.

    Bei dedizierter Hardware kann es von Vorteil sein, negative Werte zu haben, die eine negative Eingangsspannung anzeigen. In diesem Fall ist das Kompliment mit zwei die einfachste Möglichkeit, mit dem Wertebereich umzugehen. Beachten Sie, dass dieser Vorteil wegfällt, wenn der Eingangsspannungsbereich um 0 nicht symmetrisch ist.

Olin Lathrop
quelle
-1

Was ist dieser 'gerade Binärcode', von dem Sie sprechen? Ich nehme an, Sie meinen ein Vorzeichenbit, das für negativ '1' und für positiv '0' ist (oder umgekehrt ). Dies hat zwei weitere Nachteile gegenüber zwei Komplementen, die noch nicht erwähnt wurden: einen, der heutzutage weitgehend irrelevant ist, und einen wichtigen.

Das weitgehend irrelevante ist, dass Sie eine Zahl weniger darstellen können - dh 255 Zahlen in 8 Bits. Dies ist ziemlich irrelevant, wenn Sie 32 oder 64 Bit haben, aber wichtig, wenn Sie nur 4 oder 6 Bit zum Arbeiten hatten.

Das Wichtigste ist, dass es jetzt zwei Möglichkeiten gibt, dieselbe Zahl darzustellen - insbesondere 0 - +0 und -0, aber +0 und -0 sind dieselbe Zahl, sodass Ihre Implementierung sicherstellen muss, dass Sie diese nicht vergleichen Zahlen jedes Mal, wenn Sie eine Gleichheitsprüfung durchführen.

Jack Aidley
quelle
Ich denke, Sie sind hier aus der Bahn geraten. Sie sprechen von einer Darstellung der Vorzeichengröße, als das OP ziemlich deutlich von einer vorzeichenlosen binären Darstellung sprach.
Joe Hass
1
Wenn Sie von einer nicht signierten Darstellung sprechen, hat die Ergänzung von Two keinen Vorteil. Es verschwendet einfach ein bisschen.
Jack Aidley