Einführung in die Programmierung
Informatik-Grundlagenwissen: Zahlensysteme
Dieses Dokument wurde im Juli 2008 komplett überarbeitet und größtenteils neu geschrieben.
3.1. Dezimalsystem und Binärsystem
Dieses Kapitel soll Grundwissen vermitteln, das in der Programmierung immer wieder benötigt wird. Besonders wichtig sind die hier vermittelten Informationen über Zahlensysteme, wenn Sie beabsichtigen, hardwarenah zu programmieren, etwa mit C oder C++.
Das Zahlensystem, mit dem wir laufend zu tun haben, ist das Dezimalsystem. Egal ob Sie sich über eine hohe Handyrechnung, steigende Preise beim Tanken oder Ihr zu niedriges Gehalt ärgern, die darin enthaltenen Zahlen werden in Dezimalform dargestellt. Zur Auswahl stehen dazu zehn (10) verschiedene Ziffern, 0 bis 9. Das Dezimalsystem, auch Zehnersystem genannt, verwendet daher die Basis 10. Ein Beispiel:
347 ist gleich: 3 Hunderter + 4 Zehner + 7 Einer.
Was hier etwas an die Schulzeit erinnert, ist eine Betrachtung nach Stellenwerten. Mathematischer ausgedrückt:
7 * 100 = 7 4 * 101 = 40 3 * 102 = 300 ---------------- = 347
Dabei wird jede Ziffer mit ihrem Stellenwert multipliziert. Im oberen Beispiel ist 7 die niederwertigste und 3 die höchstwertigste Stelle. 7 multipliziert mit 100 (jede Zahl "hoch" 0 ist gleich 1, daher 100 = 1) gibt 7, 4 mal 101 (= 4 * 10) gibt 40 und 3 mal 102 gibt 300. Die einzelnen Werte werden addiert, also in Summe 347 (dreihundertsiebenundvierzig).
In der Praxis - im Alltag - ist so eine Betrachtung natürlich nicht nötig, Sie können sich auf Anhieb etwas unter 347 vorstellen und den Wert ermitteln. Wenn es an andere Zahlensysteme geht, wird es da schon schwieriger.
Besondere Bedeutung hat in der Informatik und Digitaltechnik das Binärsystem. Das Binärsystem, auch Dualsystem oder Zweiersystem genannt, verwendet die Basis 2, d.h. es gibt zwei (2) verschiedene Werte, nämlich Null (0) und Eins (1).
Was bedeutet nun etwa die Binärzahl 00111000? Wir können dabei genauso wie oben bei Dezimalzahlen vorgehen. Wichtig zu wissen ist auch hier: Ganz links ist die höchstwertigste und ganz rechts die niederwertigste Stelle. Um den Wert in Dezimalform zu erhalten, werden die einzelnen Stellenwerte addiert.
Umrechnung vom Binär- ins Dezimalsystem:
0 * 20 = 0 0 * 21 = 0 0 * 22 = 0 1 * 23 = 8 1 * 24 = 16 1 * 25 = 32 0 * 26 = 0 0 * 27 = 0 -------------- = 56
Die folgende Tabelle soll dieses Prinzip noch einmal veranschaulichen:
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 |
In der oberen Zeile steht der ausmultiplizierte Stellenwert in Dezimalschreibweise (z.B. 25 = 32), darunter die Werte der einzelnen Stellen aus dem oberen Beispiel. Um zu einem dezimalen Ergebnis zu gelangen, brauchen nur die Stellen addiert werden, die auf Eins gesetzt sind.
An dieser Stelle ein wichtiger Hinweis zur Schreibweise: Woran erkennt man ob es sich z.B. bei 10 um eine Binärzahl oder Dezimalzahl handelt? Um hier Verwechslungen vorzubeugen, wird häufig unter die Zahl tiefgestellt die Basis geschrieben. Soll es sich um eine Binärzahl handeln, schreibt man 102 (10 zur Basis 2), bei einer Dezimalzahl entsprechend 1010 (10 zur Basis 10). Im weiterer Folge werde ich der Einfachheit halber nur dort die Basis angeben, wo es zu Verwechslungen kommen könnte oder nicht aus dem Kontext hervor geht, worum es sich handelt.
Umrechnung vom Dezimal- ins Binärsystem:
In die umgekehrte Richtung, wenn Sie eine Dezimalzahl in eine Binärzahl umwandeln möchten, geht es natürlich auch. Dazu dividiert man die Dezimalzahl fortlaufend durch 2 und schreibt die Reste von rechts nach links an (von der niederwertigen zur höherwertigen Stelle).
Nehmen wir als Beispiel das Ergebnis der vorigen Rechnung, die Dezimalzahl 56 (korrekt angeschrieben 5610).
- 56 dividiert durch 2, gibt 28, kein Rest, dh. 0 (Null) anschreiben.
- 28 dividiert durch 2, gibt 14, 0 Rest, dh. 0 anschreiben.
- 14 dividiert durch 2, gibt 7, 0 Rest, dh. 0 anschreiben.
- 7 dividiert durch 2, gibt 3, 1 Rest, dh. 1 (Eins) anschreiben.
- 3 dividiert durch 2, gibt 1, 1 Rest, dh. 1 anschreiben.
- 1 dividiert durch 2, gibt 0, 1 Rest, dh. 1 anschreiben.
- 0 war bereits das vorherige Ergebnis, nochmals durch 2 dividieren gibt wieder 0, daher Ende der Rechnung.
Wenn Sie von rechts nach links angeschrieben haben, haben Sie nun das Ergebnis vor sich: 111000.
Ich habe bisher in impliziter Annahme immer 8 Binärziffern zusammengefasst. Das hängt mit Mengengrößen in der Informatik (und Digitaltechnik) zusammen. Eine Binärziffer (0 oder 1) bezeichnet man auch als Bit (binary digit), jeweils 8 (acht) Bits fasst man zu einem Byte (genau genommen: Oktett; ein Byte muss per Definition nicht aus 8 Bits bestehen, wenn auch diese Unterscheidung keine praktische Bedeutung hat) zusammen. Führende Nullen können wie bei Dezimalzahlen weggelassen werden (schließlich gäbe es unendlich viele). 111000 ist also gleichbedeutend mit 00111000, mit 00000000 00111000 usw.
3.2. Hexadezimalsystem
Besonders wichtig ist in der Informatik und Digitaltechnik neben dem Binärsystem auch das Hexadezimalsystem (Sedezimalsystem). Das Hexadezimalsystem verwendet die Basis 16, d.h. es gibt 16 verschiedene Ziffern, 0 bis 9 und zusätzlich die Buchstaben A bis F (sog. Zahlzeichen; können auch als klein geschrieben werden: a-f).
Mit dem Hexadezimalsystem können auf einfachere und kürzere Weise Binärzahlen notiert werden. Mit einer 4-stelligen Binärzahl (auch als Halbbyte oder Nibble bezeichnet) lassen sich 16 (24 = 16) verschiedene Zahlen darstellen, und zwar 0 bis 15 (die Null zählt mit!). Da das Hexadezimalsystem die Basis 16 (= 24) verwendet, reicht eine (!) Hexadezimalzahl aus, um vier Bits (Binärziffern) darzustellen. Mit zwei Hexadezimalzahlen kann ein Byte (8 Bits) angeschrieben werden.
Gegenüberstellung Hexadezimal-, Binär- und Dezimalsystem:
Hex | Binär | Dezimal |
---|---|---|
0 | 0000 | 0 |
1 | 0001 | 1 |
2 | 0010 | 2 |
3 | 0011 | 3 |
4 | 0100 | 4 |
5 | 0101 | 5 |
6 | 0110 | 6 |
7 | 0111 | 7 |
8 | 1000 | 8 |
9 | 1001 | 9 |
A | 1010 | 10 |
B | 1011 | 11 |
C | 1100 | 12 |
D | 1101 | 13 |
E | 1110 | 14 |
F | 1111 | 15 |
Um eindeutig darauf hinzuweisen, dass es sich um eine Hexadezimalzahl handelt, kann ebenso wie in anderen Zahlensystemen die Basis tiefgestellt dazu geschrieben werden, z.B. 3F16 (= 6310 dezimal) oder 9316 (= 14710 dezimal). Es sind aber auch andere Schreibweisen üblich: a) Vorangestelltes 0x (Prefix), z.B. 0x93. Diese Notation wird in Programmiersprachen mit C-ähnlicher-Syntax verwendet. b) Nachgestelltes h (Postfix), z.B. 93h. Letztere Schreibweise ist besonders in der Technik gebräuchlich.
Umrechnung vom Dezimal- ins Hexadezimalsystem:
Die Umrechnung funktioniert ähnlich der Umrechnung von Dezimal- zu Binärzahlen (s.o.). Nun muss aber, statt durch 2, durch 16 dividiert werden. Die Reste werden genauso von rechts nach links angeschrieben und geben, wenn das Ergebnis der Ganzzahlendivision 0 ist, das Endergebnis.
Beispiel: Die Dezimalzahl 304 soll in eine Hexadezimalzahl umgewandelt werden.
- 304 dividiert durch 16, gibt 19, kein Rest, dh. 0 (Null) anschreiben.
- 19 dividiert durch 16, gibt 1, 3 Rest, dh. 3 anschreiben.
- 1 dividiert durch 16, gibt 0, 1 Rest, dh. 1 anschreiben.
Endergebnis: 13016, das entspricht der Dezimalzahl 30410.
Umrechnung vom Hexadezimal- ins Dezimalsystem:
Die Umrechnung vom Hexadezimal- ins Dezimalsystem kann genauso wie oben von Binär->Dezimal demonstriert, erfolgen. Die einzelnen Ziffern werden mit dem jeweiligen Stellenwert (16n, wobei n = 0, 1, 2, ...) multipliziert und die jeweiligen Ergebnisse aufsummiert. Das folgende Beispiel demonstriert dies anhand der Hexadezimalzahl 13016:
0 * 160 = 0 3 * 161 = 48 1 * 162 = 256 --------------- = 304
Als Ergebnis erhalten wir 304 dezimal, womit die Probe - zur vorigen Rechnung in die umgekehrte Richtung - erfolgreich war. 30410 entspricht 13016. Diese Antwort hätte in der Praxis natürlich auch ein wissenschaftlicher Taschenrechner geliefert. :-) Es reicht dazu sogar der Windows-Rechner (den Sie nur auf die wissenschaftliche Ansicht umstellen müssen) oder unter Linux Programme wie z.B. KCalc.
3.3. Oktalsystem
Das Oktalsystem, auch Achtersystem genannt, verwendet die Basis 8 (acht). Um Zahlen darzustellen, stehen die Ziffern 0 bis 7 zur Verfügung. Die Bedeutung in der Informatik/Digitaltechnik ergibt sich dadurch, dass sich mit einer Oktalzahl drei Bits darstellen lassen. 23 ist 8, somit lassen sich mit 3 Bits 8 verschiedene Möglichkeiten darstellen. Eine Oktalzahl reicht, um diese Information wiederzugeben.
Das Oktalsystem wird hier insbesondere deshalb erwähnt, weil in vielen Programmiersprachen Zahlen auch in Oktalform angegeben werden können. Meist, z.B. in PHP, wird dazu eine 0 (Null) vorangestellt, z.B. 077 für 778 (= 6310).
Umrechnungen erfolgen genauso wie oben beim Hexadezimalsystem gezeigt. Um die Oktalzahl auszurechnen, die einer best. Dezimalzahl entspricht, dividieren Sie die Dezimalzahl fortlaufend durch 8 und schreiben die Reste von rechts nach links an. In umgekehrter Richtung - von Oktal nach Dezimal - multiplizieren Sie die einzelnen Ziffern mit dem Stellenwert (8n für n = 0, 1, 2, ...) und addieren die Teilergebnisse.
Vorheriges Kapitel |