Zweierkomplement: 1 - 1 = -4?

OP #6375573
Lesenswert?

Hallo,

ich stehe gerade auf dem Schlauch bei einer einfachen Rechnung mit dem 
Zweierkomplement: 1 - 1, also 1 + (-1), jeweils dargestellt als 
2-Bit-Zahl.

     1   ->   01
  +(-1)  -> + 11
  ----      ----
     0       100 = -4?

Ich frage mich nun wo die vorderste 1 herkommt bzw. was ich falsch 
mache/nicht beachte. Diese scheint übrigens bei jeder Subtraktion 
hinzuzukommen. Ich denke dass das was mit den Bitweiten bzw. 
Zahlenbereichen zu tun hat, aber mir fehlt gerade eine griffige 
Erklärung.
#6375589
Lesenswert?

Andreas F. schrieb:
> dargestellt als 2-Bit-Zahl.

jeweils dargestellt in der Bitbreite des Variablentyps...

Also z.B. bei 8bit

00000001 +
11111111 =
00000000

Andreas F. schrieb:
> Ich frage mich nun wo die vorderste 1 herkommt

Deine vorderste 1 kommt gar nicht, weil...
Andreas F. schrieb:
> dargestellt als 2-Bit-Zahl
... ist es "00".

Zweierkomplement-Addition und -Subtraktion funktioniert nur mit 
abgeschnittenem Überlauf korrekt.
Wenn dein Ergebnis 4bit haben soll, musst du vorher vorzeichenrichtig 
die MSBs erweitern.

mfg mf
OP #6375596
Lesenswert?

Achim M. schrieb:
> Wenn dein Ergebnis 4bit haben soll, musst du vorher vorzeichenrichtig
> die MSBs erweitern.

Vielen Dank für die schnellen Antworten. Heißt das, dass wenn ich 
sichergehen will, dass das Ergebnis in jedem Fall korrekt ist ungeachtet 
ob Addition oder Subtraktion, ich die beiden Summanden nach eventueller 
Bildung des Zweierkomplementes entsprechend um zwei (!) Bit mit 0 oder 1 
erweitern muss, je nachdem ob die Zweierkomplementbildung erfolgte oder 
nicht?
#6375606
Lesenswert?

Andreas F. schrieb:
> ich die beiden Summanden nach eventueller
> Bildung des Zweierkomplementes entsprechend um zwei (!) Bit mit 0 oder 1
> erweitern muss

Dir fehlt noch ein grundlegendes Verständnis.
in einem 4 Bit System ist eine -1 nicht 0011 sondern 1111

Du bist vom Dezimalsystem gewohnt einfach dir vorne eine 0 
davorzudenken.
in einem K2 Komplementären Binärsystem geht das nicht so einfach.
Negative Zahlen musst du hier mit einer 1 vorne erweitern.

Edit: Achim war schneller
#6375771
Lesenswert?

10 - 110 = ?

Die Umwandlung einer Subtraktion in eine Addition verläuft nach 
folgenden Schritten:

1. Der Subtrahend wird auf die volle Stellenzahl erweitert (Nullen nach 
links auffüllen). Hierbei muss die Breite der Komplementdarstellung 
beider Zahlen berücksichtigt werden. Üblich sind 4, 8, 16, 32 und 64 
Bit.
0010 - 0110 = ?
2. Die einzelnen Stellenwerte des Subtrahenden werden negiert bzw. es 
wird das bitweise Komplement gebildet.
Das bitweise Komplement von 0110 ist 1001.
3. Es wird das Zweierkomplement gebildet (Hinzuaddieren von 1).
1001 + 0001 = 1010
4. Minuend und Zweierkomplement werden addiert.
0010 + 1010 = 1100
Das Ergebnis ist -4.

Bei der Addition von Minuend und Subtrahend kann es wie bei einer 
normalen Addition zu einem Stellenüberlauf kommen. Der Stellenüberlauf 
wird ignoriert. Das Ergebnis wird mit gleicher Stellenanzahl wie Minuend 
und Subtrahend interpretiert.

Interessant wird das bei den Flags beim µC.
Die "Überträge" verschwinden nicht im Nirvana, sondern wandern als Flags 
ins Statusregister.
Als da wäre Carry, Negativ signiert, Halfcarry, Zero nur als Beispiele.
ciao
gustav

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren