www.mikrocontroller.net

Forum: PC-Programmierung Subtraktion zweier negativer Binärzahlen im Einerkomplement


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Ich möchte -4-(-2) = -2 im Einerkomplement ausrechnen, jedoch komme ich 
nicht auf das richtige Ergebnis:

-4 im Einerkomplement = 1011
-2 im Einerkomplement = 1101

   1011
 - 1101
 ------
   1111 <- auf dieses Ergebnis komme ich - ich rechne folgendes:

(beginnend von rechts nach links)
         1-1 = 0
         1-0 = 1
         0-1 = 1 + Übertrag
1-1-Übertrag = 1 + Übertrag -> Addition an niederwertigsten Stelle

1110 + Übertrag = 1111 und das entspräche der 0

Die Addition von +2 klappt super, aber man muss doch auch -2 
subtrahieren können!? Findet jemand den Fehler?

Grüße
Peter

Autor: GeraldB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du machst 2 Fehler:

1. Du muß das Zweierkomplement verwenden. Das erhält man, wenn zum 
Einerkomplement 1 addiert wird. -4 im Zweierkomplement = 1100

2. Du rechnest falsch, da man dabei nur Addieren darf. Das Subtrahieren 
einer negativen Zahl wird zu einer Addition, da sich das Rechenzeichen 
und das Vorzeichen gegenseitig aufheben.
-4-(-2) wird zu -4+2

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Binärzahlen subtrahiert man, indem man das *komplement addiert.

Wenn du durchgängig das Einerkomplement nimmst, hast du die 
Unschönheit mit zwei Nullen (0000 und 1111) im Zahlensystem.

Einerkomplement
-4     -2     -4     -(-2)  -2
1011 - 1101 = 1011 + 0010 = 1101

Einerkomplement
-4     -4     -4     -(-4)  (-)0   0
1011 - 1011 = 1011 + 0100 = 1111 = 0000

Daher nimmt man lieber durchgängig das Zweierkomplement 
(=Einerkomplement+1) mit nur einer Null (0000) im Zahlensystem.

Zweierkomplement
-4     -2     -4     -(-2)  -2
1100 - 1110 = 1100 + 0010 = 1110

Zweierkomplement
-4     -4     -4     -(-4)  0
1100 - 1100 = 1100 + 0100 = 0000

Autor: Sven Woehlbier (woehlb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ GeraldB: zu Punkt 2.

Minuend - Subtrahend = Differenz
(-4) - (-2) = (-2)

Mann kann schon die obige Gleichung direkt berechnen. Bei negativen 
Zahlen sind die führenden Bits gesetzt. Vorzeichenlos betrachtet sind 
die Zahlen also sehr groß. Das heißt, wenn Du den Zahlenstrahl als Kreis 
betrachtest reicht der Subtrahend vom Minuend bis zur Differenz und 
"passiert" dabei die Wertebereichsgrenzen und den Nullpunkt.

4 = 0100b -> Einerkomplement: 1011b -> Zweierkomplement: 1011b + 1b = 
1100b
-4 = 1100b

2 = 0010b -> Einerkomplement: 1101b -> Zweierkomplement: 1101b + 1b = 
1110b
-2 = 1110b

1100b - 1110b = 1110b

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 1. Du muß das Zweierkomplement verwenden. Das erhält man, wenn zum
> Einerkomplement 1 addiert wird. -4 im Zweierkomplement = 1100

Ja, im Zweierkomplement klappt es, aber ich muss es leider auch im 
Einerkomplement bringen :-)

> 2. Du rechnest falsch, da man dabei nur Addieren darf. Das Subtrahieren
> einer negativen Zahl wird zu einer Addition, da sich das Rechenzeichen
> und das Vorzeichen gegenseitig aufheben.
> -4-(-2) wird zu -4+2

Ok danke das wollte ich wissen. Man darf also nur addieren.

Autor: GeraldB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Sven Woehlbier

> Minuend - Subtrahend = Differenz
> (-4) - (-2) = (-2)

Ich verstehe nicht, was das mit meinem Beitrag zu tun hat.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Du rechnest falsch, da man dabei nur Addieren darf.

Nein. Subtrahieren geht auch, aber wie schon gesagt:
im Zweierkomplement:

>-4-(-2) = -2

dez             dual
  -4            1100
- -2          - 1110
------         ------
                11       ("geborgt")
  -2         (1)1110

Die 1 in der Klammer fällt weg ("geborter" Übertrag)

Autor: GeraldB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Matthias Lipinsky

> Nein. Subtrahieren geht auch,...

Auch wenn es geht, ist das nicht Sinn der Sache.

Damit man keine (kompliziertere) Subtraktion durchführen muß, addiert 
man einfach das Zweierkomplement.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mag sein, das das geht.
Aber wenn ich a-b rechnen will, und das so einprogrammiere, kann es ja 
sein das b eine negative Zahl (im 2er Kompl) ist.

Warum sollte ich dann eine Abfrage rein tun, die prüft ob b negativ ist, 
um dann das zweierkomplement zu bilden, nur um zu addieren??

da kann ich einfch auch das zweierkomplement von der variablen a 
abziehen.

Was ist an einer Subtraktion kompliziert?

Autor: GeraldB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Was ist an einer Subtraktion kompliziert?

Für eine CPU ist es auch nicht kompliziert, für einen Menschen aber 
schon.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>für einen Menschen aber schon.

Find ich nicht.

Autor: GeraldB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter

Kann es evtl. sein, daß die Rechenregel falsch ist.

Wenn man den Übertrag (Borrow) der beim MSB entsteht vom LSB 
subtrahiert, dann wurde das Ergebnis stimmen.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
GeraldB wrote:
> Wenn man den Übertrag (Borrow) der beim MSB entsteht vom LSB
> subtrahiert, dann wurde das Ergebnis stimmen.

Der Übertrag muss addiert werden.
http://www.i8086.de/historisches/einerkomplement.html

Ich habe hier übrigens auch einen Fehler drin, der sich aber nicht 
auswirkt, weil der Borrow (Übertrag) 0 ist. Nimmt man (-4) - (2) geht 
das Beispiel schief.

> Einerkomplement
> -4     -2     -4     -(-2)  -2
> 1011 - 1101 = 1011 + 0010 = 1101

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.