====== Die Darstellung von ganzen Zahlen ====== Ein Mikroprozessorsystem verarbeitet immer Bitmuster in Einheiten zu 8, 16, 32 oder mehr Bit. //Erst durch die Art der Verarbeitung wird diesem Bitmuster eine bestimmte Bedeutung zugewiesen.// Wende ich einen arithmetischen Maschinenbefehl auf ein Bitmuster an, so wird es als Zahl interpretiert, eine Ausgabe auf den Bildschirm interpretiert das gleiche Bitmuster dagegen als darstellbares Zeichen des aktuellen Zeichensatzes. **Beispiel:** Ein Byte hat den Inhalt ''01000011b'' = ''43h'' = ''67d'' Das kann unterschiedlich interpretiert werden. * ASCII-Zeichen 'C' * Vorzeichenlose oder vorzeichenbehaftete 8-Bit-Zahl: 67d = 43h * als Maschinenbefehl * Bitmuster um die Interrupts 0,1 und 6 freizugeben Hier geht es um die Interpretation von Bitmustern ganze Zahlen betrachten. Ein Mikroprozessor kann ein Bitmuster als Zahl interpretieren, dabei wird nach //ganzen Zahlen// mit und ohne Vorzeichen sowie //Fließkommazahlen// unterschieden. Um die Darstellung der ganzen Zahlen zu verstehen, betrachten wir zunächst das uns geläufige Dezimalsystem , in dem zehn verschiedene Ziffern mit Potenzen der Zahl 10 gewichtet werden: {{ :faecher:informatik:oberstufe:techinf:assembler:zahlen:10er.png?nolink |}} Ausgeschrieben bedeutet die Zahl: ''2 * 10^4 + 3 * 10^3 + 0 * 10^2 + 8 * 10^1 + 9 * 10^0 = 2 * 10 000 + 3 * 1000 + 0 * 100 * 8 * 10 + 0 * 1''. Jede Stelle hat also einen bestimmten Wert: Die ganz rechts hat den Wert 1, dann kommt der Wert 10, 100 u.s.w. Man spricht von einem Stellenwertsystem. Da ein Mikroprozessorsystem nur 2 Zustände kennt, 0 und 1, verwendet man hier als Basis die Zahl 2 anstatt der gewohnten 10: {{ :faecher:informatik:oberstufe:techinf:assembler:zahlen:2er.png?nolink |}} Ausgeschrieben bedeutet diese Zahl: ''1 * 2^4 + 1 * 2^3 + 1 * 2^2 + 0 * 10^1 + 1 *2^0 = 16 + 8 + 4 + 0 + 1 = 29d'' ==== Übertrag ==== Mit ''n'' Bit kann man also die (vorzeichenlosen) Zahlen von ''0-2^n-1'' darstellen. Überschreitet man diesen Bereich, findet ein **Übertrag** statt - der Przessor setzt das Carry-Flag: {{ :faecher:informatik:oberstufe:techinf:assembler:zahlen:auswahl_006.png?nolink |}} Addiert man zum Bitmuster von 255 '1', findet ein Übertrag von der Einer auf die Zweierstelle statt, von der Zweier- auf die Vierer u.s.w. da nur 8 Bit zur Verfügung stehen, ist das Ergebnis in 8 Bit nicht '1 0000 0000' (9 Bit) sondern '0000 0000'. Dieser Fehler wird im Carry-Flag festgehalten. ==== Negative Zahlen - Zweierkomplement ==== Negative Zahlen werden im **Zweierkomplement** notiert. Dabei hat das höchstwertige Bit ein negatives Vorzeichen: {{ :faecher:informatik:oberstufe:techinf:assembler:zahlen:2erkompl.png?nolink |}} Die Zahl oben steht für ''**-** 1 * 2^4 + 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0 = -16 + 8 + 4 + 0 + 1 = -3d'' Die Zahl unten steht für ''**-** 0 * 2^4 + 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0 = -0 + 8 + 4 + 0 + 1 = 13d'' Eine negative Zahl hat also stets eine 1 an der höchstwertigen Stelle, denn die anderen Stellen können auf keinen Fall den neagtiven Wert ausgleichen: ''1111 1111 = -1d'' Zahlen mit der Länge 8 Bit im Zweierkomplement haben also einen Wertebereich von ''-128 ... 127'' Die Darstellung im Zweierkomplement führt zu "nahtloser" Addition negativer Zahlen: {{ :faecher:informatik:oberstufe:techinf:assembler:zahlen:auswahl_007.png?nolink |}} Addiert man zu ''-1'' die Zahl ''1'' ergibt sich korrekterweise ''0'' - man muss lediglich das Carry-Flag ignorieren. Genau so rechnet ein Mikroprozessor. ==== Überlauf ==== Beim Rechnen mit Zahlen in Zweierkomplementdarstellung lauert eine andere Gefahr: Ein Übertrag auf das Vorzeichenbit, der sog. **Überlauf** ändert nämlich das Vorzeichen der Zahl! Dies passiert allerdings nur, wenn nicht gleichzeitig auch ein **Übertrag** entsteht und Mikroprozessoren setzen auch nur dann das Überlaufflag. {{ :faecher:informatik:oberstufe:techinf:assembler:zahlen:auswahl_009.png?nolink |}} Bei der Addition von ''1'' zu ''127'' findet ein Überlauf auf das Vorzeichenbit statt, man erhält plötzlich ''-128'' als Ergebnis. ==== Zahlenringe für 4Bit-Zahlen ==== Unten sieht man eine recht intuitive Darstellung der Situation als "Zahlenring" für 4 Bit lange Binärzahlen. Links vorzeichenlose Zahlen mit dem Übertrag, rechts Zahlen in Zweierkomplementdarstellung mit Überlauf. {{ :faecher:informatik:oberstufe:techinf:assembler:zahlen:auswahl_008.png?nolink |}} ==== Zahl und Gegenzahl im Zweierkomplement ==== Wenn man zu einer gegebenen Zahl im Zweierkomplement die Gegenzahl bestimmen möchte, kann man wie folgt vorgehen: * ''1011'' ist ''-8 + 3 = -5d''. Gesucht ist also die Binärdarstellung von ''+5d'' * Die invertierte Zahl ist ''0100'' (4d) * Die Gegenzahl ist ''0101'' (5d) Das klappt immer! $$-Z = \overline{Z} +1 $$