Frage von akin2000, 35

Dualzalhen subtrahieren mit Hilfe des Zweierkomplements?

Hey,

wenn ich 205-188 in Dualdarstellung ausrechnen muss... 1. 11001101-10111100 ( 205-188) 2. 11001101-01000011 // INVETIEREN 3. 01000011+ 00000001 =1000100 // 1 dazu 4. 11001101 +01000100= 100010001

Wir wissen 205-188=17 Das ergebnis müsste doch logischerweise nur 10001 sein :/ wieso ?

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von mattmiksys, 35

der Übertrag entfällt, also die vorderste 1, schon hast Du Deine 00010001

Kommentar von akin2000 ,

THX

Kommentar von mattmiksys ,

Ergänzung: Du hast Dich im 8-Bit-System bewegt, übertragen kannst Du es auch in 16-, 32- und sonstige Systeme. Dann würde das Zweierkomplement entsprechend viele Einsen vorn haben .. das Ergebnis bleibt bei entfallendem Übertrag dasselbe.

Kommentar von Etter ,

Lustig wirds doch eh erst ab 32 Bit Floating Point.

Kommentar von mattmiksys ,

klar, aber das ist hier nicht gefragt

Kommentar von Omnivore08 ,

Du liegst leider auch falsch. für eine vorzeichenbehaftete 188 braucht man mindestens 9 Bit!

Kommentar von mattmiksys ,

das ist dann die Frage des Zahlensystems. Aber wenn Du das Ausgangs-"Material" auch auf 9 Bit bringst, ist das Vorzeichen irrelevant, gelle?

Kommentar von Omnivore08 ,

Es ist zur Identifizierung des Vorzeichens aber von nöten. Bei vorzeichenbehafteten Binärzahlen steht das MSB nun mal für das Vorzeichen. Das ist per Definition so. Für 188 brauch ich mindestens 8 Bit. Soll es AUCH vorzeichenbehaftet sein, brauche ich dringend 9 Bit.

Hier eine Redundanz unter zu bringen wäre gegen die Definition von vorzeichenbehafteten Ganzzahlen in Rechnersystemen. Das ist von Zuses Z1 bis zum x86/64 gleich geblieben.

Tut mir leid...ich seh das halt anders

Kommentar von mattmiksys ,

das kannst Du gern so sehen, ändert aber am Ergebnis nichts, hat auch überhaupt nichts mit realen Maschinen zu tun. Selbst die Bewertung des Vorzeichens hat keinen Einfluss auf das Ergebnis, wenn das Ergebnis ebenso vorzeichenbehaftet interpretiert wird. Denn das ist es: eine Interpretation als Vorzeichen, worum es hier aber auch nicht ging. Denk' einfach an den elementaren Datentyp "unsigned int", da hat das höchstwertige Bit auch nichts zu tun mit Vorzeichen. Bei Interpretation als "signed int" ist es eine andere Zahl 

Kommentar von Omnivore08 ,

gut...in dem Punkt muss ich dir recht geben. Aber das ist halt was anderes als mit vorzeichenbehafteten Zahlen.

Kommentar von mattmiksys ,

nicht wirklich anders, denn die Bitoperationen sind in allen Fällen gleich, die Interpretation des MSB als Vorzeichen ist dabei zweitrangig. Um präzise zu sein, wäre natürlich eine Bewertung des Überlaufbits als Zahlenbereichs-Überlauf (Overflow) noch sinnvoll. Aber das muss ich Dir nicht erzählen ;)

Antwort
von Omnivore08, 15

um eine vorzeichenbehaftete Zahl mit mindestens 205 zu subtrahieren, brauchst du 9 Bit

also:

0 1100 1101

+ (-188)

also 0 1011 1100  --> 1 0100 0011 + 1 = 1 0100 0100

  0 1100 1101
+1 0100 0100

=(1)0 0001 0001

Der Übertrag in Klammern (das 10. Bit) fällt weg

Ergebnis: Eine klare 17

Ich hoffe ich konnte dir helfen!

Antwort
von Etter, 19

205 = 11001101

188 = 10111100

Komplement 188: 101000011

Addition 205 + (-188) = 11001101 + 101000011 (Komplement)

Ergebnis ist dann vorerst: 000010000

Da man aber noch einen Übertrag hat, muss der wieder draufaddiert werden:

00010000+1 = 00010001

Da die Zahl positiv ist, muss kein Komplement gebildet werden.


Müsste so stimmen.

Kommentar von mattmiksys ,

das ist so nicht richtig: der Übertrag hat nichts zu tun mit der zusätzlich addierten 1, die das Einserkomplement, das Du verwendest, zum Zweierkomplement macht!

Kommentar von Etter ,

Interessant. Ich kanns noch rechnen, aber nicht begründen =D

Kommentar von mattmiksys ,

Bitknispelig wird es mit der Überlegung, dass auch das Carry bei der Komplementbildung zu invertieren ist. Wenn Du also das Einserkomplement bildest (ggfs. über mehrere Bytes), so müsstest Du das Carry anfänglich auch invertieren. Addierst Du nun die Bytes schrittweise vom niederwertigsten Byte her, so bekommst Du aus dem Carry die Korrektur vom Einser- zum Zweierkomplement gleich mit.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten