**Dies ist eine alte Version des Dokuments!**
Zahlensysteme
Dossier: gfif_zahlensysteme_dossier.pdf
Zusätzliche Infos
Erklärung negative Binärzahlen & Subtraktion
Computer arbeiten immer mit fixen Bitlängen. Zum Beispiel sind moderne Computer 64-Bit Computer. Das heisst, sie rechnen intern immer mit Zahlen mit einer Länge von 64 Bit.In den 80er-Jahren hingegen war 8-Bit der Standard. Lass uns einen solchen betrachten:
Möchte ein solcher Computer die Dezimalzahl 42 speichern, so speichert er die Binärzahl $0010\,1010$. Beachte, dass die beiden Nullen links eigentlich unnötig sind, aber es müssen immer alle Bits gesetzt sein. Ein solcher Computer kann insgesamt $2^8 = 256$ verschiedene Zahlen darstellen. Wenn man einen Computer hat, der nur mit positiven ganzen Zahlen rechnen soll, ist die kleinste Zahl $0000\,0000 = 0$ und die grösste $1111\,1111 = 255_{10}$. Wenn man aber einen Computer haben möchte, der sowohl positive als auch negative Zahlen darstellen kann, müssen sich die positiven und negativen Zahlen die $256$ möglichen Plätze teilen. Der Fairness halber macht es Sinn, dass die positiven und negativen Zahlen jeweils die Hälfte der möglichen Plätze erhalten.
Es wird dann so gemacht, dass positive Zahlen mit einer $0$ links beginnen und negative Zahlen mit einer $1$. Die Dezimalzahl $+42$ wäre dann also die Binärzahl $0010\,1010$. Die positiven Zahlen gehen dann also von $0000\,0000 = 0$ bis $0111\,1111 = 127$. Es ist also nicht möglich, auf einem solchen Computer die Zahl $200$ zu speichern!
Doch welcher Dezimalzahl entspricht $1010\,1010$? Auf den ersten Blick mag es Sinn machen, zu denken, dass dies die Dezimalzahl $-42$ sei. Doch dies führt zu einem Problem: Addiert man die beiden Zahlen, so erhält man nicht Null: $$0010\,1010 + 1010\,1010 = 1101\,0100$$
Stattdessen geht man wie folgt vor, um von einer Zahl (z.B. $42_{10} = 10\,1010$) die Gegenzahl ($-42_{10} = ???$) zu finden:
- Bits hinzufügen: Füge links gegebenenfalls $0$ hinzu, so dass Zahl gewünschte Länge hat. Denke daran: Positive (negative) Zahlen haben links eine 0 (1). Da wir einen $8-$Bit Computer betrachten also: $$0010\,1010$$
- Invertieren: Nullen werden zu Einsen, Einsen zu Nullen: $$1101\,0101$$
- Eins Addieren: Rechne $+1$: $$1101\,0110$$
Dementsprechend gilt also $-42_{10} = 1101\,0110$, falls wir $8-$Bit Zahlen inkl. negative Zahlen betrachten. Ohne diese Information würde man die Zahl wohl als die positive Zahl $214_{10}$ interpretieren. Man muss also immer ganz klar sagen, wie man eine jeweilige Zahl zu interpretieren hat!
Beispiel binäre Subtraktion
Wir wollen berechnen 1101001 - 11101, wobei beide Zahlen als positive Zahlen aufzufassen sind. Bei der Subtraktion wird die erste Zahl Minuend, die Zweite Subtrahend genannt.
- Befülle mit 0, so dass beide gleich lang: 1101001 - 0011101
- Füge links ein zusäzliches Bit hinzu, damit wir auch negative Zahlen haben können: 01101001 - 00011101
- Finde 2er-Komplement von Subtrahend (Invertieren, +1): 11100011
- Addiere Minuend mit 2er-Komplement von Subtrahend: 01101001 + 11100011 = …
- Entferne Bit ganz links, da dieses nur für die Berechnung verwendet wurde: 1001100
Tipps: Code binäre Subtraktion
- Implementiere die Inversion (Umkehrung) einer Binärzahl, optimalerweise in einer eigenen Funktion.
- 2er-Komplement: Verwende dazu deinen Code/deine Funktion von 1. und addiere dann „1“ dazu. Dazu kannst du deine
binary_add()
-Funktion von früher verwenden. - Addiere zum Minuend das 2er-Komplement des Subtrahends. Verwende dazu wieder die
binary_add()
.