Andere ZahlensystemeKomplement-Darstellung negativer ZahlenDie uns geläufige Methode, negative (und positive) Zahlen darzustellen, trennt jede Zahl in ihren Betrag und in ein Vorzeichen. Die Real: NullNull spielt eine Sonder-Rolle, da sie weder negativ noch positiv sein kann. Diese Methode liesse sich auch Adressierungsarten der Z80: Relativrelativ schnell für die Speichung von Zahlen in einem Computer umsetzen, weil das Vorzeichen nur zwischen zwei Zuständen unterscheiden kann und somit in einem Datenbreite: Bits Diese Methode begünstigt Rechnen im Binärsystem: MultiplikationMultiplikation und Rechnen im Binärsystem: DivisionDivision, erschwert aber etwas die Rechnen im Binärsystem: AdditionAddition und Rechnen im Binärsystem: SubtraktionSubtraktion. Der Grund ist, dass man bei den Punkt-Rechenarten sowieso Vorzeichen und Betrag trennen muss, bei den Strich-Rechenarten aber nicht! Da die meisten 8-Bit-Mikroprozessoren, wie auch Anhang: Die Z80die Z80, aber weder multiplizieren noch dividieren können, hat man in der Informatik eine Darstellungsweise für negative Zahlen eingeführt, die die Strich-Rechenarten bevorzugt: Das 'n-1-Komplement'. Da der Computer binär rechnet und auch das Vorzeichen ein Datenbreite: Bits Was ergäbe (11011)2 um Eins erniedrigt? Das ist bestimmt auch für notorisch dem Dezimal-System verhaftete Leser nicht schwer zu entscheiden: 11011 - 1 ------ 11010 Bei (11000) minus Eins wird es schon schwieriger, weil hier ein Übertrag auftaucht: 11000 - 1 ------ 10111 Was passiert aber, wenn man von Real: NullNull noch Eins abzieht, ohne hier das negative Vorzeichen einzuführen? Man erhält einen Übertrag bis in alle Ewigkeit: 0000
- 1
----------
...11111111
Wenn man jetzt aber von einer endlichen Register-Breite in der Die ICs im Überblick: Die CPU Z80 Bei einem 8 Datenbreite: Bits Woher kommt diese Bezeichnung? Nun, man bildet das 'n-Komplement' von der nächst-kleineren Zahl: n-1-Komplement von 00000001
= n-Komplement von (00000001 - 1) = 00000000
= 11111111 (0 mit 1 mit 0 vertauschen)
Zum Beispiel das (n-1-) Komplement von 15 = (00001111)2: 15 = 00001111 - 1 = 00001110 -15 = 11110001 Das Kennzeichen, ob es sich um eine positive oder um eine negative Zahl in Komplement-Darstellung handelt, ist das oberste Datenbreite: Bits Normalerweise werden Datentypen: Bytes Man kann sie aber auch als Zahlen in Komplementär-Schreibweise auffassen: Die größte Zahl ist dann (01111111)2 = (127)10, die kleinste ist (10000000)2 = (-128)10. (10000000)2 ist die kleinste, mit 8 Datenbreite: Bits 10000000 - 1 --------- 01111111 Benutzt man für negative Zahlen immer die Komplement-Darstellung, so kann man ohne zusätzlichen Aufwand addieren und subtrahieren. Der Stetigkeits-Sprung beim Null-Durchgang (der bei der Darstellung mit Betrag und Vorzeichen auftritt), ist nicht mehr vorhanden! Sollen zwei Zahlen addiert werden, so kann man sie mit Hilfe der in der Die ICs im Überblick: Die CPU Z80 Soll eine Zahl von einer anderen abgezogen werden, so wird der Minuend komplementiert und die beiden Zahlen dann addiert. Das geht bei jeder Die ICs im Überblick: Die CPU Z80 -10 - (-20) = +10 Umwandeln der Dezimalzahlen in binäre komplementäre Schreibweise: ---> (10)10 = (00001010)2 = n ---> n-1 = (00001001)2 ---> CPL = 11110110 = -10
(20)10 = (00010100)2 = n ---> n-1 = (00010011)2 ---> CPL = 11101100 = -20
Nun rechnen: -20 wird abgezogen. Also komplementieren:
(11101100)2 = n ---> n-1 = (11101011)2 ---> CPL = 00010100 = +20
und dann addieren: 11110110 = -10
+ 00010100 = +20
----------------
100001010
Holla, was ist da passiert? Ein Übertrag über die achte Stelle fällt weg, es ergibt sich: (00001010)2 und das ist, zurück in's dezimale gewandelt, +10. Soweit ist die Komplement-Darstellung nun hoffentlich klar. Im Folgenden nur noch ein paar Queues als verkettete Liste: Anmerkung:Anmerkungen zum Umgang der Die ICs im Überblick: Die CPU Z80 Die meisten Rechenbefehle der Die ICs im Überblick: Die CPU Z80 Anhang: Die Z80Die Z80 kennt also zwei Sorten 'Überlauf': Das Carry-Flag (C/NC) signalisiert einen Überlauf, wenn die Zahlen als vorzeichenlos angesehen werden. Also: Datentypen: Bytes Das Overflow-Flag (PE/PO), das mit dem Paritäts-Flag kombiniert ist, liefert Information darüber, ob ein Überlauf stattfand, wenn die Zahlen als Vorzeichen-behaftet aufgefasst werden. Also: Datentypen: Bytes Der Z80-Befehl CPL bildet das n-Komplement des Akkus. Er vertauscht also alle Real: NullNullen mit Einsen und umgekehrt. Betrachtet man die komplementierte Zahl als nur positiv (0 bis 255), so wird folgende Rechnung durchgeführt: Operationen: BD5B / 349A / 349A: FLO SUBA := 255-Operationen: BD5B / 349A / 349A: FLO SUBA. Bei Komplement-Darstellung: Operationen: BD5B / 349A / 349A: FLO SUBA := -1-Operationen: BD5B / 349A / 349A: FLO SUBA. Demgegenüber bildet NEG das 'eigentliche' n-1-Komplement. Bei nur positiver Darstellung ist die durchgeführte Die Fließkomma-Routinen: OperationenOperation: Operationen: BD5B / 349A / 349A: FLO SUBA := 256-Operationen: BD5B / 349A / 349A: FLO SUBA. Bei komplementärer Interpretation: Operationen: BD5B / 349A / 349A: FLO SUBA := -Operationen: BD5B / 349A / 349A: FLO SUBA. Muss ein Datentypen: Bytes positive Zahl: negative Zahl:
01101011 = Datentypen: Bytes
Liegt das Datentypen: Bytes ; Operationen: BD5B / 349A / 349A: FLO SUBA ---> HL (Vorzeichenrichtig) ; LD L,Operationen: BD5B / 349A / 349A: FLO SUBA ; niederwertiges Datentypen: Bytes |