[binary] Warum bevorzugen Sie das Zweierkomplement gegenüber Vorzeichen und Betrag für vorzeichenbehaftete Zahlen?



7 Answers

Wikipedia sagt alles:

Das Zweierkomplement-System hat den Vorteil, dass es nicht erforderlich ist, dass die Additions- und Subtraktionsschaltungen die Vorzeichen der Operanden untersuchen, um zu bestimmen, ob addiert oder subtrahiert werden soll. Diese Eigenschaft macht das System sowohl einfacher zu implementieren als auch in der Lage, Arithmetik mit höherer Genauigkeit leicht zu handhaben. Außerdem hat Null nur eine einzige Darstellung, wodurch die Feinheiten im Zusammenhang mit der negativen Null vermieden werden, die in Einser-Komplement-Systemen existiert.

Mit anderen Worten, das Hinzufügen ist gleich, ob die Zahl negativ ist oder nicht.

Question

Ich bin nur neugierig, ob es einen Grund gibt, warum, um -1 im Binärsystem darzustellen, Zweierkomplement verwendet wird: Spiegeln der Bits und Hinzufügen von 1?

-1 wird durch 11111111 (Zweierkomplement) und nicht (für mich intuitiver) 10000001 dargestellt, was binär 1 mit dem ersten Bit als negatives Flag ist.

Disclaimer: Ich bin nicht auf binäre Arithmetik für meine Arbeit angewiesen!




Die übliche Implementierung der Operation ist "flippe die Bits und addiere 1", aber es gibt eine andere Art, sie zu definieren, die wahrscheinlich die Logik klarer macht. Das Zweierkomplement ist die Form, die man erhält, wenn man die übliche vorzeichenlose Darstellung nimmt, bei der jedes Bit die nächste Potenz von 2 steuert, und nur den signifikantesten Begriff negativ macht.

Unter Verwendung eines 8-Bit-Werts a 7 a 6 a 5 a 4 a 3 a 2 a 1 a 0

Die übliche vorzeichenlose binäre Interpretation ist:
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

Die Zweierkomplement-Interpretation lautet:
-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

Keines der anderen Bits verändert die Bedeutung überhaupt, und das Tragen in eine 7 ist "Überlauf" und es wird nicht erwartet, dass es funktioniert, so dass ziemlich alle arithmetischen Operationen ohne Modifikation funktionieren (wie andere bemerkt haben). Die Zeichengröße überprüft im Allgemeinen das Vorzeichenbit und verwendet eine andere Logik.




Zweierkomplement ermöglicht die Addition von negativen und positiven Zahlen ohne besondere Logik.

Wenn Sie versucht haben, 1 und -1 mit Ihrer Methode hinzuzufügen
10000001 (-1)
+00000001 (1)
du erhältst
10000010 (-2)

Stattdessen können wir hinzufügen, indem wir Zweierkomplement verwenden

11111111 (-1)
+00000001 (1) bekommst du
00000000 (0)

Das gleiche gilt für die Subtraktion.

Auch wenn Sie versuchen, 4 von 6 (zwei positive Zahlen) zu subtrahieren, können Sie das Zweierkomplement 4 addieren und die zwei zusammen addieren 6 + (-4) = 6 - 4 = 2

Dies bedeutet, dass Subtraktion und Addition von sowohl positiven als auch negativen Zahlen alle durch die gleiche Schaltung in der CPU durchgeführt werden können.




Es lohnt sich, darauf hinzuweisen, dass bei einigen frühen Addiermaschinen vor den Tagen von Digitalrechnern eine Subtraktion durchgeführt wurde, indem der Bediener Werte unter Verwendung eines verschiedenfarbigen Legendensatzes für jeden Schlüssel eingegeben hat (so würde jeder Schlüssel neun minus die Zahl eingeben) subtrahiert), und drücken Sie einen speziellen Knopf würde würde einen Übertrag in eine Berechnung annehmen. Bei einer sechsstelligen Maschine würde der Bediener also, um 1234 von einem Wert zu subtrahieren, Tasten drücken, die normalerweise "998,765" anzeigen würden, und eine Taste drücken, um diesen Wert plus eins zu der laufenden Berechnung hinzuzufügen. Die Zweierkomplement-Arithmetik ist einfach das binäre Äquivalent der früheren "Zehnerkomplement" -Arithmetik.




Ein Hauptvorteil der Zweierkomplementdarstellung, die hier noch nicht erwähnt wurde, besteht darin, daß die unteren Bits einer Zweierkomplement-Summe, Differenz oder eines Produkts nur von den entsprechenden Bits der Operanden abhängig sind. Der Grund dafür, dass der vorzeichenbehaftete 8-Bit-Wert für -1 11111111 ist, ist das Subtrahieren irgendeiner ganzen Zahl, deren unterste 8 Bits 00000001 von jeder anderen Ganzzahl, deren unterste 8 Bits 0000000 sind, ergibt eine ganze Zahl, deren unterste 8 Bits 11111111 . Mathematisch wäre der Wert -1 eine unendliche Folge von Einsen, aber alle Werte innerhalb des Bereichs eines bestimmten Integertyps sind entweder alle 1 oder alle 0 nach einem bestimmten Punkt, so dass es für Computer praktisch ist, die Zeichen "zu unterschreiben" höchstwertiges Bit einer Zahl, als ob es eine unendliche Anzahl von Einsen oder Nullen darstellt.

Zweierkomplement ist nur die einzige Vorzeichenrepräsentation, die gut mit Typen arbeitet, die größer sind als die natürliche Wortgröße einer binären Maschine, da bei der Addition oder Subtraktion der Code den niedrigsten Teil jedes Operanden holen kann, um den kleinsten Teil zu berechnen das Ergebnis, und speichere das, dann lade den nächsten Teil jedes Operanden, berechne den nächsten Teil des Ergebnisses, und speichere das usw. Somit kann sogar ein Prozessor, der alle Additionen und Subtraktionen benötigt, ein einzelnes 8-Bit-Register durchlaufen kann 32-Bit-signierte Zahlen einigermaßen effizient verarbeiten (langsamer als mit einem 32-Bit-Register, natürlich, aber immer noch brauchbar).

Bei Verwendung der anderen vom C-Standard zugelassenen vorzeichenbehafteten Darstellungen könnte jedes Bit des Ergebnisses möglicherweise durch irgendein Bit der Operanden beeinflusst werden, was es erforderlich macht, entweder einen ganzen Wert in Registern auf einmal zu halten oder Berechnungen mit einem Extra zu folgen Schritt, der zumindest in einigen Fällen das Lesen, Modifizieren und Neuschreiben jedes Teils des Ergebnisses erfordert.




Wikipedia erlaubt Addition und Subtraktion auf die normale Weise (wie Sie für vorzeichenlose Zahlen gewickelt). Es verhindert auch -0 (ein separater Weg, um 0 darzustellen, der mit dem normalen Bit-für-Bit-Verfahren zum Vergleichen von Zahlen nicht gleich 0 wäre).




Nun, deine Absicht ist nicht wirklich, alle Bits deiner Binärzahl umzukehren. Es ist eigentlich eine zufällige Übereinstimmung, dass das Subtrahieren von 1 von 1 zu 0 führt und das Subtrahieren von 0 von 1 zu 1 führt. Das Spiegeln von Bits führt diese Subtraktion effektiv aus.

Aber warum findest du den Unterschied jeder Ziffer von 1? Nun, bist du nicht. Ihre tatsächliche Absicht besteht darin, die Differenz der gegebenen Binärzahl von einer anderen Binärzahl zu berechnen, die die gleiche Anzahl an Ziffern hat, aber nur 1 enthält. Zum Beispiel, wenn Ihre Nummer 10110001 ist, wenn Sie alle diese Bits umdrehen, berechnen Sie effektiv (11111111 - 10110001).

Dies erklärt den ersten Schritt bei der Berechnung der Zweier-Ergänzung. Lassen Sie uns jetzt den zweiten Schritt - 1 hinzufügen - auch im Bild.

Addiere 1 zur obigen binären Gleichung:

11111111 - 10110001 + 1

Was bekommst du? Dies:

100000000 - 10110001

Dies ist die letzte Gleichung. Und indem Sie diese zwei Schritte ausführen, versuchen Sie diesen finalen Unterschied zu finden: Die Binärzahl wird von einer anderen Binärzahl mit einer zusätzlichen Zahl subtrahiert und enthält Nullen außer an der Stelle der Signifikanz-Bits.

Aber warum sind wir wirklich hinter diesem Unterschied her? Nun, von nun an, denke ich, wäre es besser, wenn du den Wikipedia liest.




Sie können Professor Jerry Cain aus Stanford bei der Erläuterung der Zweierkomplemente in der zweiten Vorlesung (die Erklärung bezüglich der Zweierkomplemente beginnt um 13:00 Uhr) in der Vorlesungsreihe "Programming Paradigms" sehen, die auf Standfords YouTube-Kanal zu sehen ist. Hier ist der Link zur Vortragsreihe: http://www.youtube.com/view_play_list?p=9D558D49CA734A02 .




Related