Theorie
 
 
 
 
 
Computertechnik

 
 
 
 

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.




www..de