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


von Peter (Gast)


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

von GeraldB (Gast)


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

von Stefan B. (stefan) Benutzerseite


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

von Sven W. (woehlb)


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

von Peter (Gast)


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.

von GeraldB (Gast)


Lesenswert?

@ Sven Woehlbier

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

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

von Matthias L. (Gast)


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)

von GeraldB (Gast)


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.

von Matthias L. (Gast)


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?

von GeraldB (Gast)


Lesenswert?

> Was ist an einer Subtraktion kompliziert?

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

von Matthias L. (Gast)


Lesenswert?

>für einen Menschen aber schon.

Find ich nicht.

von GeraldB (Gast)


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.

von Stefan B. (stefan) Benutzerseite


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

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.