Darstellung binär negativer Zahlen! Einerkomplement & Zweierkomplement.
Eine wirklich nette Überlegung ist diese, wie eigentlich ein Computer negative Zahlen darstellt. Das mit den Nuller und Einsern hat man ja schon gehört. Aber wie ist das mit minus Zahlen? Gibt es die -1100?? Die Lösung heißt: Einer- und Zweierkomplement
Neulich erreichte mich wieder die Frage, wie denn ein PC negative Zahlen darstellt, in dualer Schreibweise versteht sich. Wirklich interessante Frage, da es bei den Dualzahlen kein Vorzeichen gibt. Es gibt nur die Möglichkeit von 0 (Null) und 1 (Eins). Dazu stelle ich vier Methoden vor. Most Significant Bit, Least Significant Bit, Einerkomplement, Zweierkomplement.
Most Significant Bit
Das „Most Significant Bit“-Verfahren ist wohl eines der einfachsten und verständlichsten. Dabei wird einfach das letzte Bit (das ganz linke, Dualzahlen werden immer von Rechts nach Links gelesen) betrachtet. Steht dieses auf 0, handelt es sich um eine positive Zahl, weist es den Wert 1 auf so ist es eine negative Zahl.
2^7 | 2^6 | 2^5 | 2^4 | 2^3 | 2^2 | 2^1 | 2^0 | Dezimalzahl |
---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | +5 |
1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | -5 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +0 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -0 |
Im Prinzip ganz einfach. Jedoch sieht man bei dem Wert Null schon ein Problem: Es gibt zwei Nullwerte (+0,-0). Mag banal klingen, jedoch ist das in der digitalen Verarbeitung ein riesen Problem, somit wenig praktikabel.
Least Significant Bit
Ähnlich wie beim „Least Significant Bit“-Verfahren, wird hier nur ein Bit mit 0 und 1 belegt um einen negativen Wert darzustellen. Im Gegensatz wird hier aber das erste Bit, sprich das ganz rechte, dafür markiert.
2^7 | 2^6 | 2^5 | 2^4 | 2^3 | 2^2 | 2^1 | 2^0 | Dezimalzahl |
---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | +5 |
0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | -5 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | -0 |
Auch hier ergibt sich das Problem, dass der Wert Null zwei Werte annehmen kann. Zusätzlich sieht es einfach doof aus und ist nur irritierend wenn man das erste Bit mit einem Flag belegt.
Einerkomplement
Das Einerkomplement ist schon etwas raffinierter. Dieses sagt, dass alle positiven Zahlen so bleiben wie sie sind und alle negativen invertiert werden. Invertiert heißt lediglich, dass aus jeder 0 eine 1 wird und aus jede 1 eine 0. Somit dreht sich beim negativen Wert einfach die ganze Zahl um (jede Stelle wird in den jeweils anderen Dualwert geändert).
2^7 | 2^6 | 2^5 | 2^4 | 2^3 | 2^2 | 2^1 | 2^0 | Dezimalzahl |
---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | +5 |
1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | -5 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +0 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -0 |
Jetzt ist die Frage, woran erkenne ich – beim Betrachten der Dualzahl – ob ein Wert positiv oder negativ ist? Im Endeffekt auch wieder am höchsten, ganz links stehendem, Bit. Denn angenommen ich will die zahl 255 darstellen (1111 1111) und möchte diese zu -255 invertieren, dann wäre das Ergebnis 0000 0000. Somit macht es keinen Sinn das höchste Bit zu belegen und steht somit indirekt für die Unterscheidung.
Auch hier gibt es wieder das Problem der zwei Werte für Null. Warum braucht man das Einerkomplement dennoch? Ganz einfach! Um auf das Zweierkomplement überzuleiten ;)!
Zweierkomplement
Das zweier Komplement stellt – soweit hier gezeigt – das einzige Verfahren mit nur einem Nullwert dar. Dabei wird genauso vorgegangen wie im einer Komplement, nur dass auf die invertierte (Bildung des Einerkomplements) Zahl noch eines addiert wird.
2^7 | 2^6 | 2^5 | 2^4 | 2^3 | 2^2 | 2^1 | 2^0 | Dezimalzahl | ||
---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | +5 | ||
1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | Einerkompl. | -5 | |
+1 » | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | Zweierkompl. | -5 |
0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | +60 | ||
1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | Einerkompl. | -60 | |
+1 » | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | Zweierkompl. | -60 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +0 | ||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | Einerkompl. | -0 | |
+1 » | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Zweierkompl. | 0 |
Um das Zweierkomplement zu erkennen ist indirekt (genauso wie beim Einerkomplement) wieder das letzte (ganz linke) Bit verantwortlich. Würde dieses von dem +1 beeinflusst werden, würde dies immer ein Überlauf bedeuten, was wiederum eine 0 darstellt. Damit deute ich schon die Nullbildung an. Bildet man das Zweierkomplement von Null (0000 0000 » 1111 1111 + 1) so produziert man immer einen Überlauf (1 0000 0000) wobei die letzte Stelle – genau wegen dem Überlauf – nicht beachtet werden würde. So erhält man wieder den Wert 0, dadurch ist nur ein Wert dafür abbildbar!
Wertebereiche Anmerkung (ausgegangen von 8 Bit)
Bei den doppelten Nullwert-Verfahren (Most/Least Significant Bit, Einerkomplement) besteht der Wertebereich von 127 bis 0 und von 0 bis -127. Der abbildbare Bereich wäre eigentlich auf 255 (plus Wert Null also 256) Möglichkeiten beziffert, jedoch (2*127 = 254 + Nullwert = 255) geht ein Wert aufgrund des negativen minus Nullwerts verloren.
Beim Zweierkomplement gibt es genau 256 Werte, da dieser nur ein Nullwert enthält.
Very interesting details you have observed, thank you for putting up.