Dieser Artikel behandelt die Darstellung von Informationen in einem digitalen Speichermedium.

Um diesen Artikel zu verstehen, lies zuvor den Artikel über das Binärsystem.


Hinweis: Dieser Artikel behandelt Rechnersysteme, die auf der Von-Neumann-Architektur basieren. Dies ist die einzige Architektur, die in gewöhnlichen Computern wie PCs, Laptops und Handys verwendet wird.

Speicheradressierung

Der Speicher eines Rechners wird in lauter gleich große Einheiten unterteilt. Historisch bedingt sind diese immer 8 Bit groß. Eine solche Einheit nennen wir Byte. Was kann man mit einem Byte machen? Man kann Zahlen zwischen 0 und 255 darstellen – oder man verwendet das erste Bit für das Vorzeichen und kann somit Zahlen zwischen –128 und +127 darstellen.

Um eine Information zu speichern, muss man angeben können, wo im Speicher es hingehört. Dazu sind die Bytes durchnummeriert, und die Nummern nennt man Speicheradressen. Der Prozessor kann also sagen: Speichere die Zahl 15 an der Adresse 243. Je größer die Arbeitsspeicher wurden, desto größer musste man die Adressen machen: Erst 2 Byte, dann 4 Byte, dann 8 Byte, usw. Inzwischen verwenden die meisten PCs 8 Byte große Adressen, dies entspricht 64 Bit.

Little-Endian und Big-Endian

Beim Speichern einer mehrere Byte großen Zahl gibt es zwei Möglichkeiten: Entweder, man speichert die Bytes in der Reihenfolge, wie man Zahlen aufschreibt, also mit dem kleinstwertigen Byte zuletzt, oder in der umgekehrten Reihenfolge. Übertragen ins Dezimalsystem heißt das: Schreiben wir die Zahl Hundertsechsunddreißig als 136 oder als 631? Beides ist möglich, aber man muss sich für eine Möglichkeit entscheiden.

Die meisten Rechnerarchitekturen basieren heute auf Big-Endian, dies ist die aus der Mathematik vertraute Reihenfolge. Ein Gegenbeispiel ist jeodch Intels x86-Architektur. Diese basiert auf Little-Endian.

Speicherarten

Ein PC hat nicht bloß einen Speicher, sondern viele verschiedene, und diese haben verschiedene Zwecke.

Register

Die kleinste Speichereinheit. Die Register befinden sich im Prozessor und werden für Berechnungen benötigt; beispielsweise können zwei Register miteinander addiert oder multipliziert werden. Ein Register ist normalerweise genauso groß wie eine Adresse. Das heißt, auf einer 32-Bit-Architektur ist ein Register 32 Bit groß.

Die Register sind zwar klein, aber dafür ist der Lese- und Schreibzugriff auf Register sehr schnell.

Hauptspeicher

Auch Arbeitsspeicher genannt. Der Hauptspeicher enthält alle Daten, die vom Betriebssystem und dem momentan laufenden Programm benötigt werden. Dazu gehört

  • Der Maschinencode des im Moment ausgeführten Programms
  • Alle für das Programm benötigten Daten
  • Der Stack (eine Datenstruktur, die die Programmausführung steuert)

Cache

Heutzutage befindet sich zwischen den Registern und dem Hauptspeicher meist ein Cache (Pufferspeicher). Dieses kann Werte im Hauptspeicher zwischenlagern. Wenn eine Information aus dem Hauptspeicher benötigt wird, wird erst überprüft, ob sie sich im Cache befindet, denn der Zugriff auf das Cache ist schneller als auf den Hauptspeicher.

Permanenter Speicher (Festplatten, USB-Sticks, SD-Karten, …)

Jeder Computer benötigt einen permanenten Speicher, denn Daten in Registern, im Hauptspeicher und im Cache gehen verloren, sobald das Gerät ausgeschaltet wird. Ein permanenter Speicher hingegen kann (wie der Name sagt) Informationen auf Dauer aufbewahren.

Der permanente Speicher ist mit Abstand die langsamste Speicherform. Das liegt unter anderem daran, dass er normalerweise von einem komplexen Dateisystem verwaltet wird, das das Speichern von Dateien in einer Ordner-Hierarchie ermöglicht.

Bei kleineren permanenten Speichern werden meist Flash-Speicher verwendet. In diese Kategorie fallen z.B. USB-Sticks, SD-Karten und SSDs (Solid State Disks). Für größere Festplatten werden meistens Magnetspeicher verwendet, z.B. HDDs (Hard Drive Disks). Die schnelleren SSDs werden hier jedoch immer beliebter.

Arten von Informationen

Wir wissen bereits, wie wir positive ganze Zahlen speichern. Was ist mit negativen Zahlen und Kommazahlen? Oder mit Text?

Das 2er-Kompliment

Diese Zahlenrepräsentation wird für ganze Zahlen verwendet, die auch negativ werden können. Das erste Bit zeigt dabei an, ob die Zahl positiv oder negativ ist. Ist es eine 1, so ist die Zahl negativ. Als Beispiel betrachten wir 8 Bit lange Zahlen:

00101101

Diese Zahl entspricht der 45. Das ist nichts neues, wenn man das Binärsystem kennt. Ein anderes Beispiel:

11101101

Dies entspricht –19. Wie kommt man darauf? Da das erste Bit eine 1 ist, wissen wir, dass die Zahl negativ ist. Um auf die Zahl zu kommen, müssen wir zuerst alle Bits umdrehen:

11101101 wird zu
00010010

00010010 entspricht der dezimalen 18. Dazu müssen wir nur noch 1 addieren und ein Minus davor stellen.

Der Vorteil des 2er-Kompliments wird erst ersichtlich, wenn man die Addition und Subtraktion von binären Zahlen betrachtet: Die -1 hat die Darstellung 11111111. Erhöhen wir nun 11111111 um 1, dann gibt es bei jeder binären Stelle einen Übertrag und das Ergebnis ist 100000000. Da diese Zahl aus 9 Bits besteht, aber nur 8 Bits lang sein darf, wird die erste Stelle verworfen. Wir erhalten 00000000, dies entspricht der 0. Computer können im 2er-Komplement also sehr einfach rechnen.

Kommazahlen

Es gibt grundsätzlich zwei verschiedene Arten, Kommazahlen zu speichern:

Bei Festkommazahlen ist das Komma an einer bestimmten vorher definierten Stelle, beispielsweise könnte sie 8 Bit vor dem Komma und 8 Bit nach dem Komma haben. Die Zahl 26,5 in binär lautet 11010,1. Mit der hier definierten Festkommadarstellung lautet die Zahl also

00011010,10000000

Das Komma wird jedoch nicht gespeichert: Ein Computer versteht nur 0 und 1 und nichts anderes. Gespeichert wird die Zahl also als 0001101010000000, und um sie richtig zu interpretieren, müssen wir wissen, dass es sich um eine Festkommazahl handelt.

Bei Fließkommazahlen ist die Position des Kommas flexibel. Dafür müssen wir speichern, an welcher Position sich das Komma befindet. Beispiel: Bei 32 Bit großen Fließkommazahlen mit Vorzeichen ist es üblich, dass 1 Bit für das Vorzeichen, 8 Bit für das Komma und die restlichen 23 Bit für den Zahlenwert verwendet werden.

Wenn das Vorzeichen-Bit 1 ist, ist die Zahl positiv, ansonsten negativ. Die 8 Komma-Bits, genannt Exponent, bilden eine ganze Zahl, die auf die Werte von 2–126 bis 2127 abgebildet werden. Die verbleibenden 23 Bits werden Mantisse genannt. Multipliziert man deren Wert mit dem Exponenten, erhält man Zahlen zwischen –3,4 × 1038 und 3,4 × 1038. Das Besondere ist: Je näher die Zahl bei 0 liegt, desto präziser ist die Zahlendarstellung.

Strings

Strings, auch Zeichenketten genannt, können einen beliebigen Text enthalten. Ein String ist also eine Liste von Zeichen. Um diese zu speichern, wird jedem Zeichen eine Zahl zugeordnet. Mehr dazu finden Sie im Artikel Alphanumerische Codes.

Pascal-Strings und C-Strings

Bei allen bisherigen Arten von Informationen hatte eine Information immer eine feste Länge. Bei Strings ist das anders: Deren Länge ist flexibel. Und das ist ein Problem, denn im Hauptspeicher werden Informationen einfach hintereinander gelegt, und man weiß nicht, wo eine Information endet und eine neue beginnt.

In der Programmiersprache Pascal wurde das Problem so gelöst: Am Anfang jedes Strings steht die Länge des Strings in Bytes. Diese Lösung hat sich bewährt und wurde in vielen anderen Programmiersprachen ebenfalls verwendet.

In der Programmiersprache C wollte man dieses Problem umgehen, daher wird in C-Strings nicht die Länge gespeichert. Stattdessen wird ans Ende des Strings ein Null-Byte angehängt. Ein Null-Byte ist ein Byte, das nur Nullen enthält. Man kann also von vorne nach hinten durch den String gehen, so lange bis man auf ein Null-Byte stößt; wenn man es gefunden hat, weiß man, hier endet der String.

Da es in ASCII und Unicode kein Symbol mit dem Zahlenwert 0 gibt, ist das kein Problem. Ein Problem gibt es erst, wenn das Null-Byte durch einen Programmierfehler vergessen wird oder später mit einem neuen Wert überschrieben wird, denn dann hat der String kein Ende mehr, und fremde Informationen werden als Teil des Strings interpretiert.

Zeilenumbrüche

Bei Zeilenumbrüchen konnten sich die Betriebssystem-Hersteller bisher nicht auf ein einheitliches System einigen, daher gibt es dreierlei: Unter Windows werden Zeilenumbrüche durch zwei ASCII-Symbole dargestellt, nämlich CR und LF. CR steht für "Carriage Return" und hat den ASCII-Code 13. LF steht für "Line Feed" mit dem ASCII-Code 10. Unter Mac ist nur CR nötig, unter Linux-Systemen nur LF.

Dateien

Eine Datei ist ein bestimmter Speicherbereich auf einem permanenten Speichermedium, z.B. einer Festplatte. Dieser Speicherbereich ist nicht unbedingt zusammenhängend, er kann auch aus mehreren Fragmenten bestehen. Das Dateisystem gaukelt den Programmen aber vor dass, jede Datei ein einziger Datenblock ist, daher muss man sich darüber keine Sorgen machen. Ein Problem wird das erst, wenn das Dateisystem zu stark fragmentiert ist und daher langsamer wird. Dann ist eine Defragmentierung nötig.

Programme können Dateien erstellen, löschen, lesen und verändern. Manche Dateien können auch ausgeführt werden, z.B. Dateien, die ein Programm enthalten.

Es gibt zwei Arten von Dateien:

Textdateien

Textdateien enthalten ausschließlich Text, sie sind also ein String. Das einfachste Beispiel sind Dateien mit der Endung .txt. Doch auch vielen anderen Dateitypen liegt eine gewöhnliche Textdatei zugrunde. Beispielsweise werden Websites in der Programmiersprache HTML geschrieben. Wenn man eine Website herunterlädt, lässt sich die HTML-Datei in einem Texteditor öffnen und bearbeiten.

Um eine Textdatei korrekt darzustellen, muss die Zeichenkodierung richtig eingestellt sein, denn diese wird nicht mit gespeichert. Viele Texteditoren versuchen, mit verschiedenen Methoden die richtige Zeichenkodierung zu erraten, das gelingt aber nicht immer.

Binäre Dateien

Binäre Dateien lassen sich nicht in einem Texteditor öffnen - wenn man es dennoch macht, erscheint bloß ein unlesbarer Salat aus Buchstaben und seltsamen Symbolen. Diese Dateien verwenden keinen Zeichensatz, sondern einen eigenen - manchmal sogar geheimen - Code. Dafür gibt es verschiedene Gründe:

  • Datenkompression: Um eine Datei so klein wie möglich zu machen, werden komplexe Kodierungen verwendet, die man nicht als Text lesen kann.
  • Programmkompilierung: Um ein Programm auf einem Computer auszuführen, muss das Programm erst in Maschinencode übersetzt werden. Maschinencode ist die einzige Sprache, die der Computer von Natur aus versteht. Menschen verstehen ihn jeodch nicht.
  • Verschlüsselung: Dateien werden normalerweise auf binärer Ebene verschlüsselt, nicht auf Textebene. Das Ergebnis ist daher nicht lesbar.

Es gibt auch Dateiformate, die zwar binär sind, aber teilweise reinen Text enthalten. Zu diesen Formaten zählt z.B. PDF. Man kann eine PDF-Datei in einem Texteditor öffnen, wahrscheinlich sind aber Teile davon nicht lesbar.

Kommentieren Kommentare