NOT Operator ~



  • Hallo zusammen,

    ich habe eine Frage bezüglich NOT Operator an euch.

    Laut Referenz bildet man mit dem NOT Operator das Einerkomplement des Operanden.

    Wenn ich nun folgendes schreibe...

    printf("%i\n",~5);
    

    ...bekomme ich als Ausgabe die Zahl -6. <-- Das wäre doch das Zweierkomplement.

    Nun zu meiner Frage. Warum???

    Das Einerkomplement von 510 (01012) ist doch -510 (10102)

    Würde mich über eine Antwort freuen.

    Danke

    Gruß ha-gg-i



  • Ja.. Aber printf denkt du lieferst eine Zahl im Zweierkomplement.



  • Hallo,

    aber warum liefert mir dann der Taschenrechner auch die -6?

    Gruß ha-gg-i



  • Weil der auch denkt das die Zahl im Zweierkomplement repräsentiert wird.



  • Das bedeutet also, das ich mit dem NOT Operator nur solange im Einerkomplement rechnen kann, solange ich keine Ausgabe(IDE / Taschenrechner / Windows-Rechner) tätige?



  • Nein, der Not-Operator negiert einfach die Bits, was im Endeffekt das selbe ist wie beim 1er-Komplement passiert. Allerdings ist eben das was beim 1er-Komplement -5 ist beim 2er-Komplement -6... Printf und dein Taschenrechner wissens eben nicht besser! 😉



  • Irgendwie steh ich total auf dem Schlauch 🙂

    Wenn ich aber schreibe...

    1. Beispiel

    printf("%i\n",~5+10);
    

    müsste doch wieder 5 das Ergebnis sein?!?!

    Da ~5 --> -5
    -5 + 10 = 5

    Warum kommt dann da 4 raus.

    Die Ausgabe wird ja erst nach der Operation getätigt.

    2. Beispiel

    Wenn ich schreibe...

    x = ~5;
    

    ...und einen Breakpoint setze und den aktuellen Variablenwert beobachte, hat
    x auch -6 angenommen. Also kann es ja nicht an der printf-Anweisung liegen, oder?



  • Die Debugausgabe interpretiert den Wert auch als Zweierkomplement... Woher sollen Printf, Debugger & Co denn wissen WIE die paar Bits zu interpretieren sind? Sie müssen von etwas ausgehen und ausgehen tun sie allesamt von einer Repräsentation im Zweierkomplement.

    printf("%i\n",~5+10);
    

    Rechnen wir mal nach:

    5 = 0000 0101 (sowohl im 1er- als auch 2er-Komplement)
    ~5 = 1111 1010 (also im 1er-Komplement -5 ABER im 2er-Komplement -6)
    10 = 0000 1010 (im 1er- und 2er-Komplement)
    
      1111 1010
    + 0000 1010
      ---------
      0000 0100 = 4 (im 1er- Komplement UND im 2er-Komplement)
    

    (Übrigens: Um auf das korrekte Ergebnis im 1er-Komplement zu kommen muss der letzte Übertrag noch addiert werden)



  • Dankeschön für das ausführliche Beispiel. Werd mir das jetzt erstmal durch den Kopf gehen lassen müssen 🙂

    Werd mich ansonsten nochmals melden 🙂

    Vielen Dank erstmal

    Gruß ha-gg-i


Anmelden zum Antworten