Dieser Artikel behandelt die Darstellung von Informationen in einem digitalen Speichermedium.
Um diesen Artikel zu verstehen, lies zuvor den Artikel über das Binärsystem.
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
Du weißt bereits, wie positive ganze Zahlen dargestellt werden. Aber was ist mit negativen Zahlen und Kommazahlen? Oder mit Text?
Das Zweier-Komplement
Diese Zahlendarstellung 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:
Diese Zahl entspricht der 45 (32+8+4+1). Das ist nichts Neues, wenn du das Binärsystem kennst. Ein Beispiel einer negativen Zahl ist .
Diese Zahl entspricht –19. Wie kommt man darauf? Da das erste Bit eine 1 ist, weißt du, dass die Zahl negativ ist. Um auf den Betrag der Zahl zu kommen, drehst du zuerst alle Bits um:
wird zu
Das Ergebnis ist zunächst das sogenannte Einer-Komplement. Du addierst noch 1 und erhältst das Zweier-Komplement . Dies ist die Zahl 19.
Um also zu einer beliebigen Zahl in Zweier-Komplement-Darstellung der Länge Bit die entsprechende negative Zahl zu erhalten, führst du die beiden folgenden Schritte aus:
alle Bits umdrehen (invertieren)
1 addieren
Voraussetzung ist dabei, dass die Zahlen bzw. mit Bit darstellbar sind - so ist zum Beispiel die Zahl -4 im Zweier-Komplement mit 3 Bit darstellbar: . Aber wenn du das Verfahren anwendest, um +4 zu erhalten, klappt es nicht. Mit 3 Bit sind im Zweier-Komplement die 8 Zahlen -4, ..., +3 darstellbar. Die +4 ist mit 3 Bit nicht mehr darstellbar.
Der Vorteil des Zweier-Komplements besteht darin, dass du eine Zahl subtrahieren kannst, indem du einfach das Zweier-Komplement von addierst.
Beispielsweise möchtest du von 19 die Zahl 1 subtrahieren: 19 - 1 = 18. Dazu bildest zu zuerst das Zweier-Komplement von 1, also in 8-Bit-Darstellung von :
Alle Bits umdrehen: und 1 addieren: . Das Ergebnis ist -1. Und dann addierst du 19 und -1:
Das Ergebnis hat 9 Bit, da die Zahlendarstellung aber nur 8 Bit lang ist, verwirfst du die erste Stelle und erhältst das binär dargestellte Ergebnis 18. Computer können im Zweier-Komplement also sehr einfach rechnen.
Kommazahlen
Es gibt grundsätzlich zwei verschiedene Arten, Kommazahlen zu speichern:
Bei Festkommazahlen steht das Komma an einer bestimmten vorher definierten Stelle, beispielsweise könnte die Zahl 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 dabei nicht gespeichert: Ein Computer versteht ja nur 0 und 1 und nichts anderes. Gespeichert wird die Zahl also als 0001101010000000, und um sie richtig zu interpretieren, muss man wissen, dass es sich um eine Festkommazahl handelt.
Bei Fließkommazahlen (oder Gleitkommazahlen - engl. floating point numbers) ist die Position des Kommas flexibel. Dafür muss man speichern, an welcher Position sich das Komma befindet. Beispiel: Bei 32 Bit langen Fließkommazahlen ist es vorgesehen, dass 1 Bit für das Vorzeichen, 8 Bit für die Position des Kommas und die restlichen 23 Bit für den Zahlenwert verwendet werden.
Wenn das Vorzeichenbit 0 ist, so ist die Zahl positiv, ansonsten negativ. Die 8 Bits für die Position des Kommas stellen einen Exponenten dar, der Werte von bis annehmen kann. Die verbleibenden 23 Bits sind die Mantisse. Multipliziert man deren Wert mit dem Exponenten, erhält man Zahlen mit einem Betrag von bis zu .
Das Besondere ist: Je näher die Zahl bei 0 liegt, desto genauer ist die Zahlendarstellung, absolut gesehen. Relativ gesehen, also im Verhältnis zum Betrag der Zahl, ist die Genauigkeit immer gleich.
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 findest du 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.
Du hast noch nicht genug vom Thema?
Hier findest du noch weitere passende Inhalte zum Thema: