Subtraktion zweier negativer Binärzahlen im Einerkomplement

Gast #780868
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
Gast #780896
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
Persönliche Seite #780910
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
#780924
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
Gast #780944
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.
Gast #780965
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)
Gast #780980
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.
Gast #780990
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?
Persönliche Seite #781213
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren