Addierer

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Addierer
Hallo, kann mir jemand erklären warum ein für vorzeichenlose Binärzahlen ausgelegter Addierer auch Zahlen in Zweierkomplementdarstellung korrekt addiert?


Weil im Zweierkomplement eine Subtraktion das gleiche wie eine Addition mit dem Inkrement + 1 ist, wenn ich das richtig im Kopf hab.


Ich würde es mir einfach anhand eines Beispiels anschauen.

Zweierkomplement:
[Sign-Bit] | [Restliche Bits]

signed 8-bit Zahlenstrahl:

+3: 0|0000011
+2: 0|0000010
+1: 0|0000001
+0: 0|0000000
-1: 0|1111111 (entspricht 255=2^8-1 in unsigned 8-bit)
-2: 0|1111110
-3: 0|1111101 (entspricht 253 in unsigned 8-bit)

Wichtig ist, dass die Bits der negativen Zahlen vom Betrag her umgedreht sind, überall 1er stehen für die betragsmäßig kleinste Zahl (-1).

Addierst du jetzt 1 auf -3 kannst du genauso rechnen, wie du es mit einem unsigned Datentyp auch machen würdest. (Das Bitmuster von -3 entspricht 253.)

[m]| 0|0000001
|+1|1111101
|=1|1111110[/m]

Das Ergebnis entspricht dann -2 bzw. 254. Da die unsigned-Summe einen eventuellen Overflow einfach weglässt, funktioniert auch der Wechsel zwischen den Vorzeichen.

Natürlich kann die signed-Summe (genauso wie bei unsigned) kein sinnvolles Ergebnis liefern, wenn die Summe außerhalb des Wertebereichs liegt.

Jetzt kannst du verallgemeinern, was denn eigentlich die Bedingung dafür ist, dass es klappt. [size=6](Geordnete Zahlen im Abstand 1)[/size]
[size=9]Dann wirst du feststellen, dass du den Anteil an positiven und negativen Zahlen beliebig ändern kannst.[/size]
[size=8]Theoretisch könntest du den Wertebereich sogar auf nur positive Zahlen festlegen (also ohne 0). Aber dann können manche Zahlen nur Ergebnis sein, würde man mit ihnen weiterrechnen, läge das Ergebnis immer außerhalb des Wertebereichs, was irgendwie blöd wäre…[/size]