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 schreibe

    int 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 = 03426

    Und 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.


Anmelden zum Antworten