# Subtraktion mithilfe des Zweierkomplements



## Lestas89 (5. Apr 2016)

Guten Tag liebes Java-Forum!

Ich habe hier folgende Aufgabe:

(-120) - 8 soll in der Binärdarstellung mithilfe des Zweierkomplements berechnet werden. Es soll eine 8 Bit Darstellung verwendet werden.
Wie kann ich eine negative Zahl binär darstellen?

Das ist hier mein Hauptproblem.


----------



## uppss (5. Apr 2016)

Hallo Stas,

es ist schon einiges her, aber trotzdem...

nehmen wir an -12 muss binär dargestellt werden...
du machst einfach von 12 eine binäre Darstellung also:
12 = 1100 (1* 2^3 + 1*2^2 + 0*2^1 + 0*2^0 )
invertierst
0011
addierst 1 dazu
0011
+
......1
------
0100
schreibst du 1 davor -> damit zeigst du dass die Zahl halt negativ ist
10100 = -12

*-120 = 10001000 -> als Hilfe, du muss aber selber den Weg zeigen!*


----------



## Lestas89 (5. Apr 2016)

Ich verstehe das nicht. Muss man nicht einfach invertieren und eine 1 dazu addieren?Das wäre dann noch 0100 gleich -12 oder nicht? Habe das gerade bei Wiki gefunden.

+4 − 3 = +1 entspricht:          −4 − 3 = −7 entspricht:
   00000100                         11111100
+  11111101                      +  11111101
= *1*00000001                      = *1*11111001

Als Beispiel -4 in 8 Bit Darstellung: 

00000100 entspricht 4
Zweierkomplement:
11111011 +1
11111100. Das ist auch in dem Beispiel in Wiki so. Ist das nicht richtig?


----------



## Meniskusschaden (5. Apr 2016)

Lestas89 hat gesagt.:


> Muss man nicht einfach invertieren und eine 1 dazu addieren?


Ja, das stimmt.


Lestas89 hat gesagt.:


> Das wäre dann noch 0100 gleich -12 oder nicht?


Du musst beim Invertieren auch die führenden Nullen beachten.


----------



## Meniskusschaden (5. Apr 2016)

uppss hat gesagt.:


> 10100 = -12


Für eine 5-Bit-Zahl stimmt das, für eine 8-Bit-Zahl stimmt es nicht.


----------



## Lestas89 (5. Apr 2016)

Danke für deine Antwort. Dann müsste -120 in 8 Bit Darstellung doch: 0001000 sein, oder?

120 entspricht 1111000. Invertieren: 0000111 und eine 1 dazu: 0001000.

Ist das richtig?


----------



## Meniskusschaden (5. Apr 2016)

Du hast eine führende 0 übersehen. Am besten schreibt man bei acht-Bit-Darstellung auch wirklich acht Ziffern hin. Sonst übersieht man es zu leicht.


----------



## Lestas89 (5. Apr 2016)

Okay, also nochmal: 01111000 ist 120. Invertieren: 10000111 und 1 dazu ist 10001000. Das ist aber nun richtig, oder?


----------



## Meniskusschaden (5. Apr 2016)

Ja, das bekomme ich auch heraus.


----------



## Lestas89 (5. Apr 2016)

Super. Danke für die Hilfe


----------



## uppss (5. Apr 2016)

ja, das ist richtig
-120 = 10001000 wie ich oben geschriebn habe.
Anberkung: 10100 = -12 richtig nur für einer 5 Bit Darstellung, macht man davon eine 8 Bit, sieht es anders aus:
-12 mit 8 Bit = 11110100


----------



## Meniskusschaden (5. Apr 2016)

Um ein Gefühl dafür zu entwickeln, warum das Zweierkomplement eine so sinnvolle Darstellung ist, empfiehlt es sich, das mal mit Dezimalzahlen durchzuspielen.

Angenommen, man hat die zweistellige Zahl 26. Im Dualsystem ergibt die Summe aus einer Zahl und ihrem Einerkomplement (Invertieren der Bits) den größtmöglichen Wert für die Stellenzahl (also lauter Einsen). Das Pendant im Dezimalsystem wären demnach lauter Neunen. Man muß also für jede Ziffer unserer 26 die Ergänzung zur 9 einsetzen, also 2+7=9 und 6+3=9. So kommt man auf 73 (26+73=99).

Durch die Addition von 1 erhält man die nächsthöhere kleinstmögliche glatte Zahl (73+1=74; 26+74=100). Die Ursprungszahl 26 plus ihr "Zweierkomplement" 74 ergibt also genau 100. Die 74 kann in unserem System gut die -26 repräsentieren, denn mathematisch passiert genau das, was man erreichen möchte: 26 + 74 = 00 = 26 + (-26).  Eigentlich kommt natürlich nicht 00 sondern 100 heraus, aber für die führende 1 ist bei zweistelligen Zahlen ja kein Platz mehr.

Bei den Dezimalzahlen sucht man also die Ergänzung zur nächsten glatten Dezimalzahl, die nicht mehr darstellbar ist (hier 100) und im Binärsystem die Ergänzung zur nächsten glatten Dualzahl (bei acht Bit 100000000, also neun Ziffern), was durch Invertieren und Addition von 1 für Prozessoren sehr einfach ist. Wenn man damit dezimal und binär ein wenig herum spielt, wird schnell klar, wie elegant und sinnvoll das alles ist.


----------



## Lestas89 (5. Apr 2016)

Danke dir!


----------

