| Zeile 208: | Zeile 208: | ||
Seltsam, oder? Selbst wenn die Addition erfolgreich gewesen <b>wäre</b>, dann wäre diese Phänomen immer noch sehr fragwürdig. | Seltsam, oder? Selbst wenn die Addition erfolgreich gewesen <b>wäre</b>, dann wäre diese Phänomen immer noch sehr fragwürdig. | ||
| − | === | + | === Das Einerkomplement === |
| + | |||
| + | Die Sache mit dem Vorzeichenbit hat immer noch ein Problem. | ||
| + | |||
| + | Was machen wir, wenn wir die Zahl der Bits vergrößern wollen? | ||
| + | |||
| + | Wir müssen immer wissen, das MSB nicht zur Zahl selber, sondern zum Vorzeichen gehört. | ||
| + | |||
| + | Denn: | ||
| + | <font color=red>1</font><font color=blue>011</font> ist -3 | ||
| + | |||
| + | Aber: | ||
| + | <font color=green>0000</font><font color=red>1</font><font color=blue>011</font> ist 11 | ||
| + | |||
| + | Es müsst aber heißen: | ||
| + | <font color=red>1</font><font color=green>0000</font><font color=blue>011</font> ist 11 | ||
| + | |||
| + | Das kopieren eines einzelnen Bits ist ziemlich aufwendig. Also probieren wir doch mal folgenes: | ||
| + | |||
| + | |||
| + | Wir sagen einfach: | ||
| + | |||
| + | |||
| + | {| {{Prettytable}} | ||
| + | ! Bedeutung || Darstellung | ||
| + | |- | ||
| + | | positive Zahl || einfache Binärzahl wobei das MSB 0 bleiben sollte | ||
| + | |- | ||
| + | | 1<sub>(2)</sub> || Logisches Komplent des Betrags. | ||
| + | |- | ||
| + | |} | ||
| + | |||
| + | Also zum Beispiel: | ||
| + | 0100 = +4 | ||
| + | 1011 = -4 | ||
| + | 0011 = +3 | ||
| + | |||
| + | Dadurch das das logische Komplement des MSB 1 ergeben muss, lässt sich das Vorzeichen dort ablesen. | ||
| + | |||
| + | Die Addition funktioniert doch schon ganz gut: | ||
| + | |||
| + | <pre> | ||
| + | 1011 (-4) 1001 (-6) | ||
| + | +0011 (+3) +0011 (+3) | ||
| + | --------- ---------- | ||
| + | 1110 (-1) 1100 (-3) | ||
| + | </pre> | ||
| + | |||
| + | Aber wehe man überschreitet den Nullpunkt (Wir schmeißen den Übertrag raus): | ||
| + | |||
| + | <pre> | ||
| + | 1100 (-3) 1001 (-6) | ||
| + | +0101 (+5) +0111 (+7) | ||
| + | --------- ---------- | ||
| + | 0001 (+1) 0000 (+0) | ||
| + | </pre> | ||
| + | |||
| + | Das Problem ist klar. Sobald man versucht, 0 zu überschreiten, wird das Ergebnis um eins kleiner als es sein sollte. Ist ja auch logisch, schließlich liegen zwischen -1 und 1 auch zwei Zahlen, nämlich: | ||
| + | |||
| + | 1111 = -0 | ||
| + | 0000 = +0 | ||
| + | |||
| + | Wir müssen also versuchen wie wir das Problem gelöst bekommen. | ||
| + | |||
| + | === Das Zweierkomplement === | ||
Ich hoffe, ihr habt noch nicht die Hoffnung aufgegeben eine geeignete Codierung für ganze Zahlen zu finden – ich kann euch beruhigen: Dieser Ansatz wird zum Erfolg führen! | Ich hoffe, ihr habt noch nicht die Hoffnung aufgegeben eine geeignete Codierung für ganze Zahlen zu finden – ich kann euch beruhigen: Dieser Ansatz wird zum Erfolg führen! | ||
| − | Was | + | Das mit dem Einerkomplement war schon kleine Schlechte Idee. Was ist, wenn wir einfach sagen, das man zu jeder negativen Zahl die fehlenden 1 schon mal nach dem Komplementieren dazu zählen? |
| − | |||
| − | + | Dann haben wir das Zweierkomplement (2k) | |
| + | |||
| + | Wir müssen also folgendes tun: | ||
<ul> | <ul> | ||
| Zeile 222: | Zeile 287: | ||
</ul> | </ul> | ||
| − | Praktischerweise ergibt sich bei dieser Codierung, dass das MSB negativer Zahlen 1 und das von positiven Zahlen gleich 0 ist. | + | |
| + | Praktischerweise ergibt sich bei dieser Codierung, dass das MSB negativer Zahlen 1 und das von positiven Zahlen gleich 0 ist, da ja das Vorzeichen nur bei -0 (1111) zu 0000 gewechselt wird. (0 ist also immer eine Positive Zahl) | ||
====Beispiel==== | ====Beispiel==== | ||
| Zeile 243: | Zeile 309: | ||
Durch das selbe Verfahren lässt sich aus der -5 auch wieder die +5 gewinnen! | Durch das selbe Verfahren lässt sich aus der -5 auch wieder die +5 gewinnen! | ||
| + | |||
| + | Wenn wir das ganze zu Fuß machen wollen, gibt es da noch einen Weg: | ||
| + | |||
| + | # Alle Bits vom LSB bis zum ersten gesetzten Bit (=1) einschließlich übernehmen. | ||
| + | # Alle höherwertigen Bits negieren. | ||
==Fließkommazahlen== | ==Fließkommazahlen== | ||