Zweierkomplement -> Wo ist mein Denkfehler?
-
Hallo ihr Lieben.
Ich befasse mich gerade mit dem Zweierkomplmement.
Dazu habe ich folgenden Code in C gebastelt:int main() { int a = 0b00000101; printf("a: %d\n", a); a = a & 0b11111011; printf("a + b: %d\n", a); return 0; }
Als a habe ich in Binärschreibweise die 5 geschrieben.
Als Zweierkomplement wollte ich de -5 basteln.
Also den Regeln folgend:
Alle Bits umdrehen und am Ende noch +1 rechnen.
Wenn ich ale Bits umdrehe, bedeutet das ja, dass aus
00000101 dann die
11111010 wird. Und wenn ich dann noch 1 addiere, dann ahbe ich
11111011.
Aber wenn ich das "VerUNDe", dann erhalte ich die zahl 1, nicht die 0.
Die erhalte ich, wenn ich die 1 am Ende eben NICHt addiere, also die Verundung mit 11111010 mache.
Wieso ist das so?
-
@Hawaiihemd Warum sollte da 0 raus?
Das UND ist keine Addition.
-
Wieso ist das UND denn keine Addition? Genau das rechnen wir doch, wenn wir zwei Zahlen + rechnen, oder etwa nicht? Genau da irgendwo muss mein Denkfehler liegen.
-
@Hawaiihemd sagte in Zweierkomplement -> Wo ist mein Denkfehler?:
Als Zweierkomplement wollte ich de -5 basteln.
Es gibt genau drei Möglichkeiten, um das zu erreichen:
#include <stdio.h> int main() { int a = 5; // 1. int b = ~a + 1; // 2. int c = -a - 1 + 1; // 3. int d = (a ^ -1) + 1; printf ("%x %i\n", a, a); printf ("%x %i\n", b, b); printf ("%x %i\n", c, c); printf ("%x %i\n", d, d); return 0; }
Ich persönlich würde die Tilde oder eine simple Schleife bevorzugen.
-
Ach, na mensch, mir ist gerade noch eingefallen, dass ein int ja 32 bit sind. Daher muss ich es ja wie folgt machen:
int a = 0b0101; printf("a: %d\n", a); int b = 0b11111111111111111111111111111011; printf("a + b: %d\n", a+b);
Und da hat es dann geklappt...
Vielen Dank für alle weiteren Kommentare und Hilfen!
-
Edit: Hier noch meine Quelle: https://stackoverflow.com/a/6353501 ...
-
@Hawaiihemd sagte in Zweierkomplement -> Wo ist mein Denkfehler?:
Daher muss ich es ja wie folgt machen:
Das funktioniert nur für die Zahl 5.
-
@Hawaiihemd sagte in Zweierkomplement -> Wo ist mein Denkfehler?:
Wieso ist das UND denn keine Addition?
Weil der Übertrag nicht berücksichtigt wird.
Wenn man zwei Binärzahlen 01 und 10 mit „&“ verknüpft sieht man das Problem nicht, weil da das gleiche Ergebnis herauskommt 01&10 = 11 das entspricht auch 01+10=11.Ist natürlich nur für OR gültig. Wenn man aber 11 und 11 mit „&“ verknüpft bekommst Du auch nur 11 heraus. Bei der Addition ist 11+11=110 (dezimal 3+3=6). Man kann natürlich ein Addierer z.B. aus NAND Logikbausteine aufbauen.
-
@john-0 sagte in Zweierkomplement -> Wo ist mein Denkfehler?:
@Hawaiihemd sagte in Zweierkomplement -> Wo ist mein Denkfehler?:
Wieso ist das UND denn keine Addition?
Weil der Übertrag nicht berücksichtigt wird. Wenn man zwei Binärzahlen 01 und 10 mit „&“ verknüpft sieht man das Problem nicht, weil da das gleiche Ergebnis herauskommt 01&10 = 11 das entspricht auch 01+10=11.
Ne, 01 & 10 = 00
-
@Hawaiihemd sagte in Zweierkomplement -> Wo ist mein Denkfehler?:
Wieso ist das UND denn keine Addition? Genau das rechnen wir doch, wenn wir zwei Zahlen + rechnen, oder etwa nicht? Genau da irgendwo muss mein Denkfehler liegen.
Nein, da wir addiert (oder plus gerechnet) .
Dass du das Umgangssprachlich auch als „und“ bezeichnest, ist hier irrelevant.
-
@Belli sagte in Zweierkomplement -> Wo ist mein Denkfehler?:
Ne, 01 & 10 = 00
Sorry, an alle es ist wohl noch zu früh am morgen.