Binäre Zahlendarstellungen
Willemers Informatik-Ecke

Heutige Computer funktionieren mit Strom. Darum gibt es zwei Zustände: Strom ist da oder nicht. Die analoge Informationseinheit heißt Bit mit dem Inhalt 0 oder 1.

Wenn man zwei Leitungen hat, ergeben sich 4 mögliche Signale.
Leitung 1 Leitung 2 Zahlenwert
0 0 0
0 1 1
1 0 2
1 1 3
Zwei Leitungen liefern 2 Bit (parallel). Pro Leitung ein Bit. Das ergibt 4 Zustände, durchnummeriert von 0 bis 3.

Eine weitere Leitung verdoppelt die Menge der Zustände und damit den Höchstwert, der darstellbar ist.
Leitungen Zustände Wertebereich
1 1 0 bis 1
2 4 0 bis 3
3 8 0 bis 7
4 16 0 bis 15

Speicherung und Addition

Wir gehen weiterhin von einem Speicher der Größe 4 Bit aus. Es sollen die Zahlen 7, 4 und 3 binär dargestellt werden.
0 0 0 0   4 Bit
8 4 2 1   Stellenwerte
0 1 1 1   dez. 7 = 0*8 + 1*4 + 1*2 + 1*1
0 1 1 1   dez. 4 = 0*8 + 1*4 + 0*2 + 0*1
0 1 1 1   dez. 3 = 0*8 + 0*4 + 1*2 + 1*1
Wir addieren die Zahlen 7 (binär 0111) und 4 (binär 1000).
0 1 1 1  dez. 7
0 1 0 0  dez. 4
1        Übertrag

1 0 1 1  Ergebnis dez. 11
1 + 1 ergibt 0 mit einem Übertrag in die nächste Stelle.

Subtraktion

Wir ziehen 4 von 7 ab. Das ist unproblematisch, weil ohne Übertrag.
0 1 1 1  dez. 7
0 1 0 0  dez. 4
         Übertrag

0 0 1 1  Ergebnis dez. 3
Wir ziehen 1 von 4 ab. Hier kommt es zu einem Übertrag.
0 1 0 0  dez. 4
0 0 0 1  dez. 1
  1 1    Übertrag
0 0 1 1  Ergebnis dez. 3
0 - 1 ergibt 1 mit einem Übertrag von 1 auf die nächste Stelle

Negative Zahlen

Bisher gab es nur positive Zahlen. Wie muss eine negative Zahl aussehen?

Wir versuchen es mit -1, indem wir 1 von der 0 abziehen.

0 0 0 0  dez. 0
0 0 0 1  dez. 1
1 1 1    Übertrag
1 1 1 1  Ergebnis -1
Die -1 entspricht exakt der Kodierung von 15. Ob ein binärer Wert also negativ oder positiv ist, ergibt sich aus dem Betrachtungskontext.

Gegenprobe: Wir addieren eine 1 auf -1 und müssten 0 erhalten.

1 1 1 1  dez. 1
0 0 0 1  dez. -1
1 1 1 1  Übertrag
0 0 0 0  Ergebnis 0
Wenn wir weiterhin immer eine 1 abziehen ergeben sich folgende Werte:
1 1 1 1  dez. -1
1 1 1 0  dez. -2
1 1 0 1  dez. -3
1 1 0 0  dez. -4
1 0 1 1  dez. -5
1 0 1 0  dez. -6
1 0 0 1  dez. -7
1 0 0 0  dez. -8
Faustregel: Um aus einer positiven binären Zahl das negative Gegenstück zu erzeugen, invertiert man alle Ziffern und addiert anschließend eine 1 auf.

Man bezeichnet diese Darstellung als Zweierkomplement. Eine negative Zahl ist an einer 1 in der ersten Stelle erkennbar.

Rechnen mit negativen Zahlen

Bei der Subtraktion einer großen Zahl von einer kleinen Zahl muss eine negative Zahl herauskommen. Wir subtrahieren 7 von der 4
0 1 0 0  dez. 4
0 1 1 1  dez. 7
1 1 1 0  Übertrag

1 1 0 1  Ergebnis dez. -3
Es müsste bei der Subtraktion das gleiche Ergebnis herauskommen, wie bei der Addition mit einer negativen Zahl. Gegenprobe: Addieren -7 und 4
0 1 0 0  dez. 4
1 0 0 1  dez. -7
         Übertrag

1 1 0 1  Ergebnis dez. -3

Oktalzahlen

Binäre Zahlen sind aufgrund der vielen Stellen schnell unübersichtlich.

Eine Umrechnung nach dezimal und zurück ist nicht schnell gemacht.

Idee: Eine einfache Darstellung durch Zusammenfassung von je drei Bits zu einer Ziffer zwischen 0 und 7. Das ergibt ein oktales Zahlensystem.

Konvention: Oktalen Zahlen wird eine 0 vorangestellt.

Beispiel die binäre Zahl 10101110 ist dezimal 174 und oktal 0256.

1 0 1 0 1 1 1 0
--- ----- -----
2     5     6
Umrechnung von oktal 0256 nach dezimal durch Muliplikation der Stellen mit 8er-Potenzen.
2*8*8 + 5*8 + 6*1 = 174
Nachteil: Drei Stellen passen nicht gut zu 8, 16 oder 32 Bit.

Hexadezimale Zahlen

Bessere Idee: Immer vier Bit zu einer Ziffer zusammenfassen.

Nach der 9 werden die ersten Buchstaben des Alphabets angehängt. 10 wird A, 11 wird B, 12 wird C, 13 wird D, 14 wird E und 15 wird F. Kennzeichnung durch voranstellen von 0x.

Für ein Byte werden nun exakt zwei Stellen hexadezimal verwendet.

1 0 1 0 1 1 1 0
------- -------
   A       E
Umrechnung von 0xAE nach dezimal: 10*16 + 14*1 = 160 + 14 = 174 (dez)

Beispiel: Internet-Adressen

Beispielsweise haben verwenden Internetadressen nach dem Standard IPv4 vier Bytes. Eine solche Adresse könnte also in den verschiedenen Darstellungsformen so aussehen:
1100 0000   1010 1000   0000 0001   0000 0010   binär

  C    0      A    8      0    1      0    2    hexadezimal

   192         168          1           2       dezimal
Also ist die IP-Adresse 0xC0A80102, oft auch als 192.168.1.2 geschrieben, weil die meisten Menschen hexadezimal nicht gut verstehen.

Von besonderer Bedeutung ist, wenn alle Bits auf 1 stehen (Broadcast oder Masken).

1111 1111   1111 1111   1111 1111   1111 1111   binär
  F    F      F    F      F    F      F    F    hexadezimal
   255         255         255         255      dezimal
also 0xFFFFFFFF oder 255.255.255.255

Beispiel: RGB-Farben

Farben werden im Computerbereich durch ihren Anteil der Farben Rot, Grün und Blau festgelegt. In einer RGB-Darstellung ergibt sich ein Byte pro Farbanteil.
rot grün blau
FF 00 00 rot
00 FF 00 grün
00 00 FF blau
FF FF 00 gelb
00 FF FF türkis
FF 00 FF violett
7F 7F FF hellblau
FF FF FF weiß
00 00 00 schwarz

Fließkommazahlen

Fließkommazahlen in der Exponentialschreibweise Auch Fließkommazahlen müssen im Computer binär dargestellt werden. Für die Fließkommadarstellung gibt es Normen, wie etwa IEEE 754, die beschreibt, wie eine Fließkommazahl mit 32 Bit (single precision), also 4 Byte oder mit 64 Bit, 8 Byte (double precision) dargestellt wird.

Eine Fließkommazahl besteht aus einem Vorzeichen, einer Mantisse und einem Exponenten, der positiv oder negativ sein kann. Die Mantisse stellt die Ziffernstellen der Zahl dar.
Vorzeichen Mantisse Exponent
1 Bit 23 Bit 8 Bit
1 Bit 52 Bit 11 Bit

Brüche nicht immer dezimal darstellbar

Bei der Rechnung mit Fließkommazahlen gibt es Probleme bei der Genauigkeit der Nachkommadezimalstellen. Der Hintergrund ist, dass dezimale Zahlen binär dargestellt werden.

Dezimale Nachkommastellen werden durch Zehntel, Hundertstel und so fort gebildet.

Binäre Brüche sind 1/2, 1/4, 1/8 und so weiter.

Bei der Umwandlung kann es Probleme geben, wie bei der Umwandlung von Dritteln in Dezimal offensichlich sind:

10 / 3 sind 3,333333... Multipliziert man den Wert mit 3 ergibt sich 9,9999999...

Binärbrüche

Wie stellt man 0,1 binär dar?

1/10 ist kleiner als 1/8, aber größer als 1/16?
Binärbruch Ziffer Rest
1/2 0 0,1
1/4 0 0,1
1/8 0 0,1
1/16 1 0,0375
1/32 1 0,00625
1/64 0 0,00625
1/128 0 0,00625
1/256 1 0,00234375
1/512 1 0,000390625
Das könnte man schnell mal für 40 Zahlen ausrechnen. Aber lassen wir das doch den Computer tun. Wir schreiben ein Programm in der Sprache Python:

zweierpotenz = 1.0
dezi = 0.1
i = 1
binziffer = ""
while i<40:
    zweierpotenz *= 2
    bruch = 1.0/zweierpotenz
    if bruch<=dezi:
        dezi = dezi - bruch
        binziffer += "1"
    else:
        binziffer += "0"
    i = i + 1
print(binziffer)
Das Ergebnis des Programms lautet:
000110011001100110011001100110011001100
Der Wechsel zwischen 2 Nullen und 2 Einsen wiederholt sich bis in alle Ewigkeit. Darum gilt: Ein Zehntel ist binär nur durch eine Periode darstellbar.

Was hat das für Konsequenzen? Wir schreiben ein Python-Programm, das von 0.5 immer wieder 0.1 abzieht, bis es bei --0.5 ankommt. Dabei muss irgendwann die 0 auftauchen, oder?

zahl = 0.5
dezi = 0.1
while zahl>-0.5:
    zahl -= dezi
    print(zahl)
Auf dem Bildschirm erscheint:
0.4
0.30000000000000004
0.20000000000000004
0.10000000000000003
2.7755575615628914e-17
-0.09999999999999998
-0.19999999999999998
-0.3
-0.4
-0.5

Größeneinheiten

8 Bit im Verbund sind ein Byte

210 = 1024

Darum 1 KByte = 1024 Byte. Achtung: statt km oder kg wird das k hier großgeschrieben.

1024 KByte = 1 MByte (Mega)

1024 MByte = 1 GByte (Giga)

1024 GByte = 1 TByte (Terra)

Verkäufer rechnen die Größen gern in 1000er-Faktoren, da dann die Zahlen größer sind.