Negative binäre Zahlen
Einleitung Wertebereich / negative Ganzzahlen
Natürlich können wir nicht einfach ein Minuszeichen vor eine
duale Zahl stellen, dies würde ja wieder Speicherplatz benötigen.
Da wir nur die Information 0 und 1 speichern wollen, haben wir also
die Möglichkeit mit einer 0 oder 1 zu kennzeichnen ob wir eine Zahl
positiv oder negativ interpretieren. Dazu haben wir uns im Teil
Subtraktion ja schon mit der Bildung von Komplementen befasst. Wir
entwickeln die negativen Zahlen in drei Schritten.
Positive Ganzzahlen
Die bisherigen Überlegungen lassen uns nur
positive Ganzzahlen darstellen. Die kleinste Zahl ist 0, die größte
Zahl hängt von der zur Verfügung stehenden Speichermenge ab. Wir
haben uns bisher auf ein Byte beschränkt. Normalerweise werden aber
je nach Programmiersprache mehrere Bytes zu einer Speicherstelle
zusammengefasst. Typischerweise sind das zwei oder vier Bytes. Das
bedeutet, dass die größten darstellbaren Dezimalzahlen dann 65535
beziehungsweise 4294967295 sind.
Negative Ganzzahlen - 1. Versuch
Der nächste Schritt ist jetzt die Einführung
negativer Zahlen. Dies erscheint recht einfach, ist jedoch ziemlich
schwer. Ich werde die negativen Zahlen in drei Schritten erklären.
Bitte lesen Sie mindestens bis zum dritten Versuch, denn erst dort
werden die "richtigen" negativen Zahlen beschrieben.
Wir beschränken uns der Einfachheit halber wieder auf ein Byte.
Selbstverständlich ist das Prinzip wieder auf mehrere Bytes als
Speicherbereich übertragbar.
Wir kennzeichnen negative Zahlen einfach mit einem führenden Bit.
Diese Bits nennt man manchmal auch "flags".
Aus 1 = 00000001 wird dann -1 = 10000001.
Aus 17 = 00010001 wird dann -17 = 10010001.
Negative Ganzzahlen - 2. Versuch
Die Version 1 der negativen Ganzzahlen hat
jedoch einen entscheidenden Nachteil. Bei den positiven Ganzzahlen
erreiche ich durch die Addition von 1 jeweils die nächst größere
Zahl. Bin ich bei der maximalen Zahl angekommen, so führt die
Addition von 1 durch den Überlauf dazu, dass ich wieder am unteren
Ende ankomme (siehe Kapitel "Vorsicht Überlauf"). Bei negativen
Zahlen laut Version 1 führt die Addition von 1 jedoch nicht -
mathematisch richtig - zur größeren Zahl, sondern zur kleineren.
Beispiel: 10000001 + 00000001 = 10000010 dies ist jedoch
mathematisch falsch, denn in dezimaler Schreibweise steht hier -1 +
1 = -2 !!! Aus diesem Grund stellt man negative Zahlen nicht nur
durch die Kennzeichnung mit dem ersten Bit dar, sondern man
verwendet dazu die oben schon eingeführte Komplementbildung.
Das Einerkomplement - Teil 2
Durch die Bildung des Einerkomplementes besitzt
unser Wertebereich plötzlich zwei Nullen, nämlich 00000000 und
11111111. Addiere ich zu -1 = 11111110 die 1 = 00000001, so bekomme
ich 11111111. D. h. wir haben noch einen logischen Fehler in
unseren Überlegungen. Diesen Fehler bessern wir durch die Bildung
des Zweierkomplementes aus. Das Zweierkomplement der Null ergibt
dann wieder Null. Aus 00000000 wird im Einerkomplement 11111111 und
durch die Addition von 00000001 und den Überlauf wieder zu
00000000.
Das Zweierkomplement - Teil 2
Durch die Bildung des Einerkomplementes besitzt
unser Wertebereich plötzlich zwei Nullen, nämlich 00000000 und
11111111. Addiere ich zu -1 = 11111110 die 1 = 00000001, so bekomme
ich 11111111. D. h. wir haben noch einen logischen Fehler in
unseren Überlegungen. Diesen Fehler bessern wir durch die Bildung
des Zweierkomplementes aus. Das Zweierkomplement der Null ergibt
dann wieder Null. Aus 00000000 wird im Einerkomplement 11111111 und
durch die Addition von 00000001 und den Überlauf wieder zu
00000000.
Negative Ganzzahlen - 3. Versuch
Geschafft! Die negativen Zahlen werden also
durch Bildung des Zweierkomplementes dargestellt. Hier ein paar
Beispiele:
1 = 00000001 wird zu -1 = 11111111
5 = 00000101 wird zu -5 = 11111011
17 = 00010001 wird zu -17 = 11101111
Ich kann also immer noch am ersten Bit erkennen, ob eine Zahl
negativ oder positiv ist.
Wertebereich von negativen Ganzzahlen
Nehme ich ein Byte als Speichergrenze, so
bekomme ich folgende interessante Zahlen
00000000 = 0
01111111 = 127
10000000 = -128
Mein ehemaliger Wertebereich von 0 bis 255 verändert sich also zu
-128 bis +127. Auch hier habe ich wieder insgesamt 256 verschiedene
Zahlen. Unsere Interpretation der Zahlen ändert sich.