1. Zahlen und Zeichen

1.0. Alfabete und Codes

1.0.1. Ein Alfabet ist eine (meist endliche) geordnete Menge von Zeichen.

Beispiele:

das Alfabet der lateinischen Buchstaben: a, b, c, ..., z
das Alfabet der griechischen Buchstaben: α, β, γ, ..., ω
das Alfabet der Dezimalziffern: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
ein Alfabet von Pfeilen: ←, ↑, →, ↓
ein Alfabet von Smileys: ☹, ☺, ☻
das Alfabet der Morsezeichen: ·–, –···, ––·, ·, …

1.0.2. Ein Code ist eine Abbildung zwischen zwei Alfabeten.
Die im Code verwendeten Zeichen heißen auch Codeworte. Codeworte können sich aus mehreren elementaren Zeichen zusammensetzen, zum Beispiel beim Morsecode aus Punkten, Strichen, sowie Pausen.

Beispiele:

Winkersignale
Zwei Flaggen werden mit den Armen in zwei von 8 verschiedenen Positionen gehalten. Dies bedeutet jeweils einen Buchstaben und dient zur visuellen Telekommunikation.
Semaphore Flag Signalling System

Flaggenalfabet
Bunt gemusterte Flaggen stehen für jeweils einen Buchstaben. Anwendung in der Seefahrt.
International Marine Signal Flags

Morsecode
a  →  ·–
b  →  –···
g  →  ––·
e  →  ·

Lochkartencode
Ziffern und Buchstaben werden durch Gruppen von wenigen Löchern in Spalten von Pappkarten codiert. Der erste Einsatz erfolgte bei den Volkszählungen 1890 in den USA und Österreich.

Lochstreifencode
Kombinationen von Löchern in 5 Spalten eines Papierstreifens codieren Buchstaben oder Zahlen (mit Umschaltfunktion).

ASCII: American Standard Code for Information Interchange.
Bildet Buchstaben und Sonderzeichen auf die Zahlenmenge {0 ... 127} ab. Wurde im Laufe der Jahrzehnte vielfach abgewandelt bzw. – unter Ausnutzung der i.A. zur Verfügung stehenden 8 Bit pro Codewort – ergänzt.
Die abgebildete Codetabelle stellt den Zeichensatz ISO 8859-15 dar, der den verbreiteten westeuropäischen Zeichensatz ISO 8859-1 um das Euro-Symbol ergänzt. Die linke Hälfte (entsprechend 7 Bit) entspricht dem ASCII.

Unicode: Der universelle Zeichensatz, der das Zeichencode-Chaos auf Computern in Zukunft ablösen wird.
Bildet Schriftzeichen aller Sprachen weltweit auf einen genügend großen Zahlenbereich ab.
Unicode.org

Gray-Stibitz-Code
Dezimalziffern werden so auf jeweils 4 Nullen oder Einsen abgebildet, dass sich beim Zählen mit jedem Schritt nur eine Stelle ändert. Solche "einschrittigen" Codes haben Vorteile insbesondere bei mechanischen Zählwerken bzw. immer dann, wenn die synchrone Änderung aller Bestandteile des Codewortes nicht gewährleistet ist und beim Ablesen der Codeworte Zwischenzustände gelesen werden könnten.
0 0010
1 0110
2 0111
3 0101
4 0100
5 1100
6 1101
7 1111
8 1110
9 1010

1.0.3. Ein Bit ist die kleinste Informationseinheit. Sie kann den Wert 0 oder 1 annehmen.

1.0.4. Ein binärer Code ist einer, dessen Codeworte sich aus Bits zusammensetzen.

1.0.5. Für die Darstellung in digitalen Schaltungen eignen sich insbesondere binäre Codes fester Stellenzahl. (Das hängt mit der technischen Realisierung solcher Schaltungen zusammen.)

1.1. Codierung natürlicher Zahlen

1.1.1. Ein Stellenwertsystem zur Basis b ist eine Codierung, die jeder natürlichen Zahl d eine Ziffernfolge dn...d0 zuordnet (b ist eine natürliche Zahl > 2, di ∈ {0..b−1}), so dass der Zahlenwert jedes Codeworts sich wie folgt bestimmt:

dn...d0 = d = n

i=0
di × bi

Um klarzustellen, in welchem System eine Ziffernfolge codiert ist, wird häufig die Basis des Stellenwertsystems als Index ans Ende der Zahlendarstellung notiert: 12345(b) (die Basis selbst wird dabei im Allgemeinen im Dezimalsystem geschrieben).

1.1.2. Im Dezimalsystem ist b=10.

Beispiel:
376(10) = 3 × 102 + 7 × 101 + 6 × 100 = 300 + 70 + 6 = 376

1.1.3. Im Binärsystem oder Dualsystem ist b=2.

Beispiel:
1011010(2) = 1 × 26 + 0 × 25 + 1 × 24 + 1 × 23 + 0 × 22 + 1 × 21 + 0 × 20 = 64 + 16 + 8 + 2 = 90

Für b=2 wird die Abbildung d → dn...d0 auch Binärcode genannt.

1.1.4. Im Oktalsystem ist b=8.

Beispiel:
570(8) = 5 × 82 + 7 × 81 + 0 × 80 = 320 + 56 = 376

1.1.5. Im Hexadezimalsystem ist b=16. Zur Darstellung werden daher sechzehn verschiedene Ziffern benötigt, zu welchem Zweck die vorhandenen zehn Dezimalziffern um die Buchstaben A, B, C, D, E, F für die Ziffernwerte 10 bis 15 ergänzt werden.

Beispiel:
2A7(16) = 2 × 162 + A(16) × 161 + 7 × 160 = 2 × 162 + 10 × 161 + 7 × 160 = 512 + 160 + 7 = 679

1.1.6. Die folgende Tabelle enthält eine Übersicht der Darstellungen der ersten Zahlen in den verbreiteten Zahlensystemen; bei einigem Umgang damit werden sich die Darstellungen bald einprägen:

dezimalbinäroktalhex
0000
1111
21022
31133
410044
510155
611066
711177
81000108
91001119
10101012A
11101113B
12110014C
13110115D
14111016E
15111117F
16100002010

1.1.7. Die Beliebtheit des Oktal- und des Hexadezimalsystems beruht darauf, dass wegen 8=23 und 16=24 die Umrechnung zwischen ihnen und dem Binärsystem einfach ist, denn eine Oktal- bzw. Hex-Ziffer kann jeweils auf 3 bzw. 4 Binärziffern abgebildet werden:

570(8) = 101111000(2)
570
101111000
2A7(16) = 1010100111(2)
2A7
001010100111

1.1.8. Die Konvertierung zwischen Zahlendarstellungen nach der Formel des Stellenwertsystems ist etwas umständlich; außerdem muss die Zwischenrechnung jeweils innerhalb des Zielsystems durchgeführt werden.

Beispiel: Wandlung der Dezimalzahl 679 ins Hexadezimalsystem (Rechnung im Hexadezimalsystem)
679(10) = 6 × A2 + 7 × A1 + 9 × A0 = 6 × 64 + 7 × A + 9 = 258 + 46 + 9 = 2A7
Zwischenrechnung zur Ermittlung von A2: A(16)2 = 10(10)2 = 100(10) = 96(10) + 4(10) = 6 × 16(10) + 4 = 6 × A(16) + 4 = 64(16)

Deshalb ist es für die Praxis sehr nützlich, dass es zwei handliche Methoden zur Konvertierung zwischen Binär- und Dezimaldarstellung gibt; bei der Konvertierung von bzw. in Oktal- oder Hex-Zahlen ist es dann meist am effektivsten, das Binärsystem als Zwischendarstellung zu nehmen.

Konvertierung binär → dezimal
Trick: die Faktoren bi werden schrittweise berechnet; es gilt

dn...d0 = n

i=0
di × bi = dn × bn + dn−1 × bn−1 + ... + d1 × b1 + d0 × b0
= (...(dn × b + dn−1) × b + ... + d1) × b + d0
Beispiel: 101111000(2) = (((((((1 × 2 + 0) × 2 + 1) × 2 + 1) × 2 + 1) × 2 + 1) × 2 + 0) × 2 + 0) × 2 + 0
Die Vorgehensweise ist daher so, dass wir die Ziffern von links nach rechts durchgehen, jeweils auf das Zwischenergebnis addieren, und beim Weitergehen zur nächsten Stelle nach rechts das Zwischenergebnis mit 2 multiplizieren. Die Zwischenergebnisse im Beispiel sind: 1, 2, 5, 11, 23, 47, 94, 188, 376

Konvertierung dezimal → binär
Trick: das Verfahren umkehren; der Wert wird solange halbiert, bis 0 übrig bleibt. Die jeweiligen Reste ergeben die Binärziffern von rechts nach links.
Beispiel:

Werte halbieren   Reste  aufreihen
376
0 Ergebnis: 101111000
188
0
94
0
47
1
23
1
11
1
5
1
2
0
1
1
0

1.2. Rechnen mit Binärzahlen

1.2.1. Addieren zweier natürlicher Binärzahlen funktioniert wie gewohnt, d.h. als Stellenwertaddition von rechts nach links.

Beispiel: 1010 + 11011
1 0 1 0
1 1 0 1 1
Übertrag  

Ergebnis 1 0 0 1 0 1

Rechenschritte     0+1=01
  1+1+0=10
"0 hin, 1 im Sinn"
0+0+1=01
...

1.2.2. Multiplizieren zweier natürlicher Binärzahlen funktioniert wie gewohnt, nur einfacher. Wende eines der üblichen Multiplikationsschemen an, bei denen entweder der linke oder der rechte Faktor stellenweise mit dem anderen multipliziert und die Einzelprodukte aufsummiert werden.

Beispiel: 10111 * 10111
 10111 * 10111

10111 0 10111 10111 10111
ü 1 1 1 1 ü 101010
1000010001
  • Bei der Addition der Einzelprodukte kommt es öfters vor, dass die Summe in einer Stelle größer als 3 ist; dann gibt es mehrstellige Überträge, die man am Besten auf die entsprechend mehreren nächsten Stellen aufteilt. Es können sich dann mehrere Überträge in einer Stelle aufsammeln (Im Dezimalsystem kann dies vorkommen, wenn mindestens 11 Summanden addiert werden.)
  • Das Multiplizierwerk eines Computers wird entweder die Additionen schrittweise durchführen (also immer nur zwei Summanden auf einmal) oder hochgradig optimiert sein und nicht nach diesem Multiplikationsschema arbeiten.
  • Ü Warum ist das Multiplizieren im Binärsystem einfacher als im Dezimalsystem?

    1.2.3. Subtrahieren: Wir werden bald sehen, dass man Binärzahlen nicht zu subtrahieren pflegt.

    Dividieren: Auch nach dem üblichen Divisionsschema (nur einfacher).

    1.3. Rechnen bei fester Stellenzahl

    1.3.1. Beim automatischen Durchführen von Rechnungen mit Hilfe digitaler Schaltungen stehen für die Darstellung der Zahlenwerte bestimmte Anzahlen von Bits zur Verfügung, die ja schließlich irgendwie elektrotechnisch realisiert werden müssen. Während sich mit dem binären Stellenwertsystem im Allgemeinen beliebig große Zahlen bearbeiten lassen, sind wir nunmehr auf einen endlichen Zahlenbereich beschränkt.

    Die n-stellige Binärcodierung BCn bildet einen passenden Wertebereich natürlicher Zahlen ab in die Menge der n-stelligen Bitfolgen, wobei zunächst gemäß dem binären Stellenwertsystem codiert wird und dann mit führenden Nullen auf n Stellen aufgefüllt wird.

    Beispiel: BC4 (5) = 0101

    1.3.2. Wertebereich: Mit n Bits lassen sich 2n verschiedene Codeworte darstellen, also die Zahlenwerte 0, ..., 2n−1 .

    1.3.3. Die Rechnung mit fester Stellenzahl funktioniert zunächst genauso wie mit unbegrenzter Stellenzahl. Gibt es jedoch einen Übertrag in die Stelle n (die n+1-ste Stelle, da die rechteste Stelle den Index 0 hat), so kann das Ergebnis in den n vorgesehenen Stellen nicht mehr dargestellt werden (es liegt außerhalb des Wertebereichs) und es liegt ein Überlauf vor.

    Beispiel: n=4, addiere 10+11:
    1 0 1 0
    1 0 1 1
    1 0 1 0

      0 1 0 1

    1.4. Ganze Zahlen

    1.4.0. Zur Darstellung einer Menge ganzer Zahlen wählt man zunächst eine Codierung, bei der die negativen Zahlen leicht zu erkennen sind. Außerdem beschränken wir uns auf die Darstellung mit fester Stellenzahl.

  • vorderstes Bit = 0: diese Codeworte beschreiben eine positive Zahl, z.B. 0000, 0001, 0101.
  • vorderstes Bit = 1: diese Codeworte beschreiben eine negative Zahl, z.B. 1000, 1010, 1111.

    Die Codierung positiver Zahlen soll mit der Codierung im binären Stellenwertsystem übereinstimmen.
    Für den negativen Zahlenbereichs sind die folgenden beiden Codierungen von Bedeutung.

    1.4.1. Einerkomplement-Codierung

    Das Einerkomplement EK eines Codewortes bzw. einer Bitfolge bn−1...b0 ist die Bitfolge en−1...e0 , bei der jedes Bit invertiert (d.h. 0 und 1 gegeneinander vertauscht) wurde, d.h. ei = 1 − bi für alle i.
    Z.B. EK (001010) = 110101

    Die n-stellige Einerkomplement-Codierung ECn (Einerkomplementdarstellung) bildet ab:

    +x > 0 → ECn (x) = BCn (x)
    −x < 0 → ECn (−x) = EK (BCn (x))
    Z.B.: 4 → 0100 , −4 → 1011

    Wertebereich: Mit n Bits lassen sich 2n verschiedene Codeworte darstellen, allerdings gibt es in der Einerkomplement-Codierung für die Null lästigerweise zwei Darstellungen (alle Bits 0 und alle Bits 1), daher sind 2n−1 Zahlen darstellbar, somit der Zahlenbereich −2n−1+1 ... 2n−1−1.

    Beim Addieren in der Einerkomplement-Darstellung wird zunächst das übliche Additionsschema (stellenweise von rechts nach links) angewandt. Falls aus der höchsten Stelle ein Übertrag entsteht, muss dieser jedoch in einer Korrekturaddition and niedrigster Stelle hinzuaddiert werden.
    Beispiel: subtrahiere 0101 − 0011:

    0 1 0 1
    1 1 0 0
    1 1 0 0

      0 0 0 1
          + 1

      0 0 1 0

    1.4.2. Zweierkomplement-Codierung

    Das Zweierkomplement ZK eines Codewortes bzw. einer Bitfolge bn−1...b0 wird gebildet, indem zum Einerkomplement noch 1 addiert wird.
    Z.B. ZK (001010) = 110101 + 1 = 110110
    dez.2er-K.
    70111
    60110
    50101
    40100
    30011
    20010
    10001
    00000
    −11111
    −21110
    −31101
    −41100
    −51011
    −61010
    −71001
    −81000
    Die n-stellige Zweierkomplement-Codierung ZCn (Zweierkomplementdarstellung) bildet ab:
    +x > 0 → BCn (x)
    −x < 0 → ZK (BCn (x))
    Z.B.: 4 → 0100 , −4 → 1011 + 1 = 1100

    Nebenbemerkung: Die Korrekturaddition aus der Einerkomplement-Darstellung ist hier gewissermaßen in die Codierung integriert.

    Wertebereich: Mit n Bits lassen sich 2n verschiedene Codeworte darstellen, in der Zweierkomplement-Codierung gibt es für die negativen Zahlen ein Codewort mehr – der Wertebereich ist unsymmetrisch, es ist der Zahlenbereich −2n−1 ... 2n−1−1.

    Beim Addieren in der Zweierkomplement-Darstellung wird das übliche Additionsschema (stellenweise von rechts nach links) angewandt. Das Vorzeichenbit wird dabei einfach mit addiert. Falls aus der höchsten Stelle ein Übertrag entsteht, wird dieser zunächst ignoriert.

    Die Kodierung einer negativen Zahl −k in n-stelliger Zweierkomplementdarstellung kann auch als vorzeichenlose Darstellung von 2n−k interpretiert werden. Daraus und unter Betrachtung der Rechnungen modulo 2n (also unter Ignorierung aller Vielfachen von 2n) lässt sich mathematisch die Funktion des einfachen Additionsverfahrens motivieren und nachweisen:
    a + (2n − b) = (a − b) + 2n = a − b (modulo 2n)
    An der Codetabelle (abgebildet für n=4) lässt sich auch sehen, dass gegenüber der Codetabelle für vorzeichenlose Zahlen sozusagen die obere Hälfte ins Negative nach unten verschoben worden ist, und zwar um 2n. Auch das erklärt intuitiv die Funktion des Additionsschemas unter Ignorieren des Übertrags-Bits.
    Für die Erkennung eines Überlaufs bei der Addition in Zweierkomplement-Darstellung gibt es zwei Kriterien:
    • Vorzeichen-Vergleich der Summanden und des Ergebnisses: bei der Addition zweier positiver Zahlen muss das Ergebnis positiv sein bzw. entsprechend negativ; werden eine positive und eine negative Zahl addiert, tritt nie ein Überlauf ein. Die Anwendung dieses Kriteriums erfordert allerdings die Betrachtung der Summanden, was für die automatische Verarbeitung unpraktisch ist.
    • Ein Überlauf ist genau dann eingetreten, wenn die beiden Überträge aus der letzten und vorletzten Stelle verschieden sind.

    Beispiele: ...

    1.5. Gleitkommazahlen

    1.5.1. Zur Darstellung besonders kleiner oder großer Zahlen gibt es die Schreibweise Gleitkommadarstellung, bei der die Größenordnung des Zahlenwerts durch einen Faktor ausgedrückt wird, der aus einer Potenz zur Basis des Stellenwertsystems besteht.

    Beispiele: 1,234 × 1025 oder −23,4 × 10−8

    Die Darstellung setzt sich zusammen aus dem Vorzeichen (+ oder −), der Mantisse (1,234) und dem Exponenten (25).

    In der normierten Darstellung befindet sich vor dem Komma genau eine Ziffer ungleich 0. Eine nicht-normiert dargestellte Zahl lässt sich normieren, indem das Komma zur normierten Darstellung verschoben wird und der Exponent entsprechend angepasst. Wird das Komma um k Stellen nach rechts (links) verschoben, wird dadurch der Wert der Mantisse um den Faktor 10k erhöht (vermindert), so dass zum Ausgleich der Exponent um den Betrag k vermindert (erhöht) werden muss, damit der dargestellte Zahlenwert gleich bleibt:

    123,45 × 1025 = 1,2345 × 1027
    0,012345 × 1025 = 1,2345 × 1023

    1.5.2 Binäre Gleitkommadarstellung
    In der binären Gleitkommadarstellung wird für den Exponenten die Basis 2 benutzt. In der normierten Darstellung steht vor dem Komma immer eine 1.

    Beispiel: 1,01101 × 20101 (gemischte Notation, um Verwirrung der Basis 10(2) mit der Basis 10(10) zu vermeiden)

    1.5.3 Seien y = vy × my × bey und z = vz × mz × bez zwei Zahlen in Gleitkommadarstellung, wobei jeweils v = 1 oder −1, je nach dem, ob das Vorzeichen + oder − ist.

    Multiplikation
    Unter Berücksichtigung der Gesetze der Potenzrechnung ist y × z = vy × vz × my × mz × bey + ez
    Die Komponenten der Gleitkommadarstellung beider Zahlen können also jeweils miteinander verknüpft werden und es resultiert passenderweise wieder eine Zahl in Gleitkommadarstellung. Das Ergebnis kann allerdings 2 Stellen vor dem Komma haben, in welchem Fall es noch normiert werden muss. Die Schritte sind wie folgt:
    1. Vorzeichen kombinieren: vy × vz
    } gleichzeitig ausführbar!
    2. Mantissen multiplizieren: my × mz
    3. Exponenten addieren: ey + ez
    4. Ergebnis normieren

    Addition
    Unter Berücksichtigung der Gesetze der Potenzrechnung ist y + z = (vy × my + vz × mz) × bey nur wenn ey = ez
    Andernfalls ist eine Denormierung eines der beiden Summanden durchzuführen, um die Exponenten einander anzupassen, damit eine Addition durchgeführt werden kann.
    Ist z.B. ey > ez, so verschiebe das Komma von z um ey − ez Stellen nach links (bzw. die Stellen von mz um diese Stellenzahl nach rechts bei feststehendem Komma); der Exponent wird dabei angeglichen und die Addition kann nach obiger Gleichung ausgeführt werden.
    Allgemein sind die Schritte wie folgt:
    1. Denormieren
    2. Mantissen unter Einbeziehung der Vorzeichen addieren bzw. subtrahieren
    3. Ergebnis normieren

    1.5.4 Standard-Gleitkommaformate
    Nachdem früher jeder Computerhersteller ein eigenes Gleitkommaformat definiert und in seiner Hardware realisiert hatte, wurden endlich von der IEEE (Institute of Electric and Electronic Engineers) Standardformate definiert, die sich mittlerweile durchgesetzt haben. Der Exponent wird in Zweierkomplement-Kodierung dargestellt, von der Mantisse, die ja in normierter Darstellung im Binären immer mit "1," anfängt, wird nur der Nachkommateil, die sogenannte fraction, ins Codewort aufgenommen.
    NameBits VorzeichenBits ExponentBits Fraction
    IEEE 32-Bit1823
    IEEE 64-Bit11152
    TFH165
    Das Format "TFH" dient der kurzen Notation von Beispielen; ein Codewort im TFH-Format sieht z.B. so aus:

    0 0 0 0 1 0 1 0 1 1 0 1
    Die codierte Zahl ist +1,01101 × 2000101 = +1,01101 × 25 .

    1.5.5 Ü Multipliziere die Codeworte (TFH-Format) 000010101101 × 111110110110 .