Verständnisproblem beim Zweierkomplement
-
Salvete,
ich habe eine kurze Frage zur Binärdarstellung von negativen Zahlen. Zwar habe ich in einem anderen Thread darüber schonmal gesprochen, doch ist mir die Sache noch nicht ganz klar. Wenn ich folgendes schreibeint a = -5;
dann wird zunächst 5 im Binärsystem dargestellt, also 101. Angenommen wir befinden uns auf einem 16 Bit System, dann würde a als positive Zahl so aussehen:
0000000000000101
Der zusätzlich freien Stellen, werden mit Nullen aufgefüllt, denn dadurch wird gesagt, dass die Zahl positiv ist. Da a hier aber negativ ist, werden dann die Nullen durch Einsen ersetezt? Ensteht folgendes:
1111111111111101
Meiner Ansicht kann das doch gar nicht sein, denn nun kann der Compiler nicht mehr entscheiden. Ist nun 101 die Zahl oder 11111101?
Wie funktioniert die korrekte Schreibweise wirklich?Vielen Dank für eure Hilfe
lg, freakC++
-
5=00000101
-5(einerkomplement)=11111010 //jedes bit invertiert!
-5(zweierkomplemet)=11111011 //+1 zum einerkomplement
-
freakC++ schrieb:
Der zusätzlich freien Stellen, werden mit Nullen aufgefüllt, denn dadurch wird gesagt, dass die Zahl positiv ist. Da a hier aber negativ ist, werden dann die Nullen durch Einsen ersetezt?
Nene. Wikipedia:
- Vorzeichen ignorieren und ins Binärsystem umrechnen: 5(10) = 00000101(2)
- Invertieren: Not[00000101] = 11111010
- Eins addieren: 11111010 + 00000001 = 11111011
freakC++ schrieb:
Meiner Ansicht kann das doch gar nicht sein, denn nun kann der Compiler nicht mehr entscheiden. Ist nun 101 die Zahl oder 11111101?
Ganz klar, die Zahl ist 11111011. 101 wäre ja 5, hier wurde aber -5 angegeben.
-
Wenn ich ehrlich bin, dann muss ich zugegeben, dass ich durch deine schnelle Antwort noch nicht sehr weiter bin. Es kann aber auch sein, dsas der Grund daran liegt, dass ich mich mit dem Einerkomplement nicht ausgesetz habe.
Was ist denn heute etabliert? Das Einer- oder das Zweierkomplement?
Könntest du deine Antwort mit noch ein bisschen Text ausschmücken, damit ich deine Lösung besser verstehe
Trotzdem vielen Dank
lg, freakC++@Badestrand: Danke für die Antwort. Was bedeutet das [Not] und warum muss ich 1 hinzuaddieren? Danke!
-
freakC++ schrieb:
Was bedeutet das [Not] und warum muss ich 1 hinzuaddieren? Danke!
Not ist eine Operation, die einfach alle Bits umdreht. Man addiert 1 dazu, weil man das beim Zweierkomplement (siehe Wiki-Artikel) einfach so macht..
edit: Im Einerkomplement werden einfach nur alle Bits umgedreht. Das Zweierkomplement hat aber den Vorteil, dass im Prozessor nicht zwischen Addition und Subtraktion oder negativen und positiven Zahlen unterschieden werden muss, es ist der gleiche Rechenweg.
-
Etabliert ist das Zweierkomplement, da du sonst zwei Darstellung der 0 hast (00000000 und 11111111), was für Ganzzahlen nicht sinnvoll ist. Schau dir halt die Wikipediaartikel dazu an.
Deine Frage zielte wohl darauf ab, warum man nun 11111011 als -5 und nicht als 251 interpretiert. Das liegt ganz einfach daran, dass der Zahlenbereich für positive Zahlen halbiert wird, nur noch Zahlen kleiner (oder kleiner gleich, hab grade keine Lust mir darüber Gedanken zu machen ;)) als 0x7f sind positiv. Das erste Bit gibt dir also wiederum das Vorzeichen an, wie bei der simpelsten Methode negative Zahlen einzubauen.
-
freakC++ schrieb:
Könntest du deine Antwort mit noch ein bisschen Text ausschmücken, damit ich deine Lösung besser verstehe
Aber nur im Dezimalsystem.
Zahl=00453
Neunerkomplemet=99546 //alle Ziffern invertiert
Zehnerkomplement=99547 //Eins mehr als Neunerkomplement.
Und jetzt kommt der fette Trick:
Zahl+Neunerkomplemet=99999 //Logisch
Zahl+Zehnerkomplemet=00000 //Habe ja nur 5-Ziffern-Zahlen
also
Zehnerkomplent=00000-Zahl
also
Zehnerkomplement=-Zahl
Das hat folgenden Effekt:
Ich will mal 03879-00453 rechnen, aber habe vergessen, wie man mehrstellig subtrahiert. Ich mache einfacj den Zehnerkomplement-Trick:
03879-00453 = 03879+ZK(00453) = 03879+99547 = 03426Und so gehts im binären auch. Durch das Zweierkomplement muß man keine Fallunterscheidungen machen ob jetzt mit einer positiven oder negativen Zahl addiert.
Das Zweierkomplement hat sich durchgesetzt, total.