Forum: Mikrocontroller und Digitale Elektronik Zweierkomplement: 1 - 1 = -4?


von Andreas F. (andgset)


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.

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


Lesenswert?

Du musst das Ergebnis auf die Stellenzahl der beiden Operanden begrenzen
(in diesem Fall also auf 2).

von nein (Gast)


Lesenswert?

Der Übertrag (carry-bit) wird einfach verworfen.

Andreas F. schrieb:
> 100 = -4?

00 = 0

von Walter T. (nicolas)


Lesenswert?

-1 = 11 gilt nur, wenn Dein System genau zwei Stellen hat. Dann ist auch 
00 = 0

von Achim M. (minifloat)


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

von Andreas F. (andgset)


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?

von Achim M. (minifloat)


Lesenswert?

Andreas F. schrieb:
> je nachdem ob die Zweierkomplementbildung erfolgte oder nicht?

Jein. Immer das MSB nach vorn ausrollen...

01 ---> 0001
11 ---> 1111

mfg mf

von Udo S. (urschmitt)


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

: Bearbeitet durch User
von Andreas F. (andgset)


Lesenswert?

Achim M. schrieb:
> Jein. Immer das MSB nach vorn ausrollen...

Genau das meinte ich. Danke für die Klärung!

von Karl B. (gustav)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.