|
|
|
|
|
|
|
|
|
Zahlen beschreiben elektrische Signale |
||
|
.. Addition von positiven Dualzahlen |
||
|
|
||
|
Die
Addition im dualen Zahlensystem funktioniert genauso wie im
Zehnerzahlensystem, nur mit der ungewohnten Besonderheit, dass
bereits bei der Addition von 1+1 ein Übertrag eintritt. Der
Grund hierfür ist einfach zu verstehen. Dezimal ergibt 1+1
=2. Im dualen Zahlensystem wird die Zahl zwei als 10
dargestellt. Aufgelöst ist das Ergebnis von 1+1 im dualen
Zahlensystem also 0 und der Übertrag ist 1. In einer
Tabelle lassen sich die vier Möglichkeiten der
zweistelligen Addition wie folgt darstellen ..
0 + 0 = 0 .. Übertrag 0 0 + 1 = 1 .. Übertrag 0 1 + 0 = 1 .. Übertrag 0 1 + 1 = 0 .. Übertrag 1 |
||
|
|
Längere Zahlen lassen sich nun problemlos addieren, wie in den folgenden Beispielen gezeigt wird. Das einzige Problem stellt sich ein, wenn das Ergebnis nicht in die Speicherzelle hineinpasst. Im Gegensatz zu einem Blatt Papier auf dem man rechnet, sind Speicherzellen nicht beliebig groß. Sie sind in der Anzahl ihrer Stellen auf 8, 16, 32 64Bit usw. begrenzt. Dieses Problem betrifft alle Prozessoren. Bei den folgenden Aufgaben findet die Berechnung in einem 8Bit System statt. |
|
|
|
|
|
|
|
|
|
|
|
Beispiel 1 |
|
1.Zahl 55 = 0011 0111
2.Zahl + 156 = + 1001 1100
Überträge C + 0 0111 100
------- C ---------
Ergebnis 211 = 1101 0011
|
||
|
|
Die
Berechnung beginnt mit den letzten zwei Ziffern 1+ 0 = 1,
Übertrag 0. Dann folgen die Rechnung ..
1 + 0 + 0 = 1, Übertrag 1 .. 1 + 1 + 0 = 0, Übertrag 1 .. 1 + 1 + 1 = 1, Übertrag 1 usw. Der letzte Übertrag ist 0 und das Ergebnis ist 211, wie es nach der dezimalen Rechnung zu erwarten war. Dieses Ergebnis würde, wie die beiden Ausgangszahlen in einen Byte-Speicher passen. Doch was geschieht, wenn das Ergebnis grösser wird als 255, also binär 1111 1111b? |
|
|
|
|
|
|
|
Beispiel 2: |
|
1.Zahl 192 = 1100 0000
2.Zahl + 156 = + 1001 1100
Überträge C + 1 0000 000
------- C ---------
Ergebnis 348 ... 0101 1100 = 92
richtig wäre 348 = 1 0101 1100
|
|
|
|
|
Würde
man nur die Zahl im Rechenregister der CPU, dem Akkumulator
ansehen, dann wäre das Ergebnis falsch. Fügt man dem
Inhalt des Akkumulators jedoch noch den letzten Übertrag,
das Carry hinzu, dann ergibt sich das richtige Ergebnis.
Das Carry-Flag (C): Bei den Addierwerken in CPUs werden die Überträge in der Carry-Flagge C abgelegt und nach der Addition einer Stelle dem Ergebnis hinzuaddiert. Wie in obiger Rechnung, verbleibt auch hier der letzte Übertrag im Carry-Flag. Betrachtet der Programmierer in seinem Programm nach einer Addition die Carry-Flagge, kann er feststellen, ob das Ergebnis im Akkumulator richtig ist C=0 oder falsch C=1. Ist das Ergebnis falsch, so muss er das Ergebnis verwerfen, oder in zwei Speicherbytes aufheben. Dabei wäre dann das niedrigste Bit des zweiten Bytes, die 1 aus dem Carry-Flag. |
|
|
|
348 = [0000 0001] [0101 1100] |
|
|
|
Das diese Erkenntnis auch bei der Addition der zwei grössten 8-Bit Zahlen richtig ist, zeigt das letzte Beispiel. Die grösste Zahl in einem Byte-Speicher lautet 255 = 1111 1111b. 255 + 255 = 510 und .. |
|
|
|
510 = [0000 0001] [1111 1111] |
|
|
|
|
|
|
|
Die hier vorgestellten Gesetzmässigkeiten wurden an Bytespeichern vorgestellt. Sie gelten aber ebenso für Worte, Doppelworte und noch grössere Speicherzelleneinheiten. Das Carry-Flag C zeigt an, wenn bei der Addition ganzzahliger positiver Zahlen ein zusätzliches Bit für das Ergebnis benötigt wird. Der Übertrag kann aber nie grösser werden als ein Bit, selbst wenn die grössten Zahlen zweier Speicher addiert werden. |
|
|
|
Ein Addierwerk => |
|
|
|
|
|
|
|
Zahlentypen
bei der höheren Programmiersprache C
Bei
höheren Programmiersprachen wie C werden dem Programmierer
bereits unterschiedlich grosse Variablenspeicher angeboten. Man
redet hier von Variablentypen. Eine Programmierzeile wie ..
unsigned int a, stellt dem Programmierer eine 2 Byte=16Bit grosse Speicherzelle mit dem Namen a zur Verfügung, in die Zahlen zwischen 0 und 65535 hineinpassen. Weiss der Programmierer, dass bei seinen Berechnungen Zahlen vorkommen können die grösser sind, darf er diesen Speichertyp nicht verwenden. Anders als oben beschrieben hat er bei C keine unmittelbare Kontrolle über das Carry-Flag und kann an seinen gewählten Variablentyp keine weiteren Speicherzellen anhängen. Er sollte also gleich den nächst höheren Variablentyp verwenden, und das wäre .. long unsigned int. Hier stehen 4 Bytes=32Bit pro Variable zur Verfügung und damit kann die größte Zahl 4.294.967.295 lauten. Ach ja, .. genau ein Byte erhält ein C-Programmierer, wenn er den Variablentyp unsigned char benutzt. Nun kann er nur noch mit den positiven Zahlen von 0 bis 255 arbeiten. unsigned (ohne Zeichen) bedeutet ohne Vorzeichen, int kommt von Integer (ganze Zahl) und char kommt von Character (Zeichen). In den Speicherzellen des letzten Typs können die Verschlüsselungscodes von ASCII-Zeichen abgelegt werden, die reichen gerade von 0-255. Das ergab ihren Namen. Aber man kann natürlich auch mit den Zahlen zwischen 0 bis 255 rechnen. |
|
|
|
|
|
.de