haben wir
den Hauptspeicher eines Computers kennengelernt.
In ihm werden die gerade auszuführenden Programme bzw. Programmteile
sowie die benötigten Daten gespeichert.
Der Hauptspeicher eines Computers muß in der Regel vom Prozessor sehr schnell zugreifbar sein und ist dementsprechend verhältnismäßig teuer. Zum langfristigen Speichern größer Datenmengen, die gerade nicht benötigt werden, können langsamere und billigere Speicher wie Magnetplattenspeicher, häufig auch als Festplatte bezeichnet, verwendet werden. Erst bei Bedarf werden die Daten aus diesem sogenannten Hintergrundspeicher in den Hauptspeicher geladen.
Im allgemeinen greift man nicht auf ein einzelnes Speicherelement sondern auf eine Speicherzelle zu. Speicherzellen fassen dabei 8 einzelne Speicherelemente zusammen und repräsentieren ein sogenanntes Byte , also 8 Bit. Die Zusammenfassung mehrerer Speicherzellen (4 oder 8) wird auch als Speicherwort bezeichnet.
Speicherelemente, -zellen und -wörter werden zum (dauerhaften) Abspeichern von Werten benutzt. Eine Speicherzelle kann demnach 21 = 2 verschiedene Werte abspeichern, ein Speicherelement 28 = 256 und ein Speicherwort 232 oder 264 Werte.
Sogenannte int-Variablen 4.1 dienen in Programmiersprachen zum Aufbewahren ganzzahliger Werte wie -4, 0 oder 1023. Für die Abspeicherung eines int-Wertes wird im allgemeinen ein Wort mit 4 Speicherzellen reserviert. Das bedeutet also, es können insgesamt 232verschiedene ganzzahlige Werte in einer int-Variablen gespeichert werden bzw. anders ausgedrückt, der Wertebereich einer int-Variablen ist beschränkt auf 232 verschiedene Werte.
Stellen Sie sich vor, Sie wollen eine Dezimalzahl - bspw. die ,,23`` - im Rechner, genauer gesagt in einer int-Variablen, abspeichern. Wie erfolgt nun eine Umrechnung dieser Dezimalzahl in eine 32-stellige Dualzahl?
Es existieren verschiedene Codierungsverfahren. Bei dem gängigsten wird das erste der 32 Bits einer int-Variablen genutzt, um das Vorzeichen darzustellen: ,,1`` bedeutet, daß die Zahl negativ ist; ,,0`` bedeutet, daß die Zahl positiv ist. Somit können also 231 negative ganzzahlige Werte und 231-1 positive ganzzahlige Werte sowie die Null abgespeichert werden; der Wertebereich einer int-Variablen umfaßt alle Ganzen Zahlen zwischen -231 und 231-1. Größere bzw. kleinere ganzzahlige Werte können nicht dargestellt werden.
Die Umrechnung einer positiven Dezimalzahl in eine Dualzahl erfolgt nach folgendem Schema: Man dividiert die umzurechnende Dezimalzahl ganzzahlig fortlaufend durch 2 bis die 0 erreicht wird und merkt sich jeweils den Rest der Division. Die Dualzahl ergibt sich anschließend durch das Lesen der Reste in umgekehrter Reihenfolge. Beispiel:
23 : 2 = 11 R 1
11 : 2 = 5 R 1
5 : 2 = 2 R 1
2 : 2 = 1 R 0
1 : 2 = 0 R 1
D.h. die Dezimalzahl ,,23`` wird im Dualsystem durch die Ziffernfolge ,,10111`` dargestellt. Bei der Abspeicherung dieser Zahl in einer int-Variablen werden diesen fünf Ziffern 27 Nullen vorangestellt.
Zur Umrechnung einer negativen Ganzen Zahl ins Dualsystem gehen Sie folgendermaßen vor: Rechnen Sie zunächst die entsprechende positive Ganze Zahl wie oben beschrieben in eine Dualzahl um, kehren Sie dann alle Ziffern um (aus ,,0`` wird ,,1`` und aus ,,1`` wird ,,0``) und addieren Sie den Wert 1. Die Addition von Dualzahlen funktioniert dabei genauso wie die Addition von Dezimalzahlen, nur daß Sie lediglich 2 Ziffern zur Verfügung haben, so daß es viel schneller zu einem Übertrag kommt; ,,1`` + ,,1`` im Dualsystem ergibt also ,,10``. Beispiel:
23 = 00..0010111
-23 = 11..1101000 + 1 = 1..101001
Ein bei der Programmierung zu beachtender Effekt tritt auf, wenn Sie zum Wert 231-1 (2147483647), also dem größten in einer int-Variablen darzustellenden Wert, den Wert 1 addieren.
0111..111 2147483647
+ 0000..001 + 1
----------- -----------
1000..000 -2147483648
Wie Sie sehen, kippt hierbei das erste Bit um, das das Vorzeichen der Zahl bestimmt. Und in der Tat ergibt sich bei dieser Addition der Wert -231 (-2147483648). Das bedeutet: Das Verlassen des Wertebereich an einer Seite führt zum Eintreten in den Wertebereich an der anderen Seite.
). Im ersten Bereich
wird der Programmcode
selbst abgelegt, der zweite Bereich enthält
statische Daten wie globale Variablen des Programms.
Die Größen dieser beiden Bereiche lassen sich bereits zur Compilierzeit
ermitteln. Der dritte und vierte Bereich des Laufzeitspeichers sind
variable groß, die Summe der beiden Größen ist jedoch in der Regel
konstant. Den dritten Bereich
nennt man Stack und den vierten Bereich Heap .
Der Stack wird für die Verwaltung von Prozedur- und Funktionsaufrufen4.2 benutzt. Wird eine Funktion aufgerufen, dann wird die Ausführung der gerade aktiven Funktion unterbrochen, und Informationen zum Zustand der Funktion wie die aktuellen Registerwerte werden auf dem Stack gespeichert. Wenn die Kontrolle nach Beendigung der aufgerufenen Funktion zurückkehrt, wird mit Hilfe der abgespeicherten Informationen der alte Zustand wiederhergestellt. Auch lokale Variablen von Funktionen werden auf dem Stack gespeichert.
Viele Programmiersprachen erlauben die Zuweisung von Speicherplatz für Daten unter Programmkontrolle; der Speicherplatz für diese Daten wird vom Heap genommen.