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 = 5Warum 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