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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Andreas F. (andgset)


Bewertung
0 lesenswert
nicht 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)


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

von nein (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Der Übertrag (carry-bit) wird einfach verworfen.

Andreas F. schrieb:
> 100 = -4?

00 = 0

von Walter T. (nicolas)


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

von Achim M. (minifloat)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.