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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.