Hi,
in meinem Skript zur Technischen Informatik wird folgendes Verfahren vorgestellt:
Subtraktion
Die Subtraktion zweier Dualzahlen erfolgt meist durch die Addition des Zweier-Komplements
(zur nächst höheren Basispotenz). Hierbei berechnet sich die Differenz D aus Minuend M
und Subtrahend S wie folgt:
Meine Fragen dazu: Ich verstehe das so, dass die Subtraktion durch eine Addition ausgedrückt werden
soll, aber warum tauchen dann mitten im Verfahren wieder Subtraktionen auf.
und was bedeutet … + (10000000-1011)-10000000 ?
reine Algebra, geht mit Dualzahlen genau so wie mit Dezimalzahlen, es wurde nur 0 = 10000000 -10000000 künstlich eingefügt
Warum das ganze: das Zweierkomplement ist im wesentlichen ein Bit-Flip 0<->1, ist wahnsinnig leicht zu berechnen
Und die Subtraktion (M+K)-B^n ist einfach (denk mal drüber nach wie das aussieht)
Und wenn dein Mikroprozessor schon zwei Register addieren kann, dann wärs doch albern auch noch die Subtraktion in Silizium zu gießen, wenn es einfacher auch geht
[quote=bisaflor]D = M - S = M +(B^n - S) - B^n = M + K - B^n[/quote]Ich weiß ja nicht, von wem diese komische Formel stammt aber eigentlich basiert das Zweierkomplement selbst ausschließlich auf Addition und Negation.
Der Knackpunkt dabei ist, dass das ausschließlich mit Zahlen fester Länge funktioniert, wir aber immer Zahlen flexibler Länge gewöhnt sind. Das Umdenken ist der entscheidende Schritt zum Verständnis. Darüber hinaus ist das höchstwertige Bit nicht Teil des Wertes sondern das Vorzeichen.
Um das Beispiel aufzunehmen:[quote=bisaflor;123713]123 - 11 = 112
123 = 1111011; 11 = 1011[/quote]Hier liegt schon das erste Problem, das diese komplizierte Formel notwendig macht. Es fehlt nämlich der Schritt, die führenden Nullen zu ergänzen. Das geht aber nur, wenn man sich für eine Zahlenlänge entscheidet.
Man kann also klassisch mit 8 Bit weiterrechnen (123 = 01111011; 11 = 00001011),
etwas moderner mit 16 Bit (123 = 0000000001111011; 11 = 00000000000001011),
oder mit 32 Bit (123 = 0000000000000000000000000001111011; 11 = 00000000000000000000000000000001011)
(Das ist noch nicht das Ende… ;o))
Bleiben wir mal bei 8.
Wir negieren also den Minuend bitweise:
00001011 -> 11110100
und addieren dann eine 1
11110100 + 1 = 11110101
Jetzt werden Minuend und das Zweierkomplement des Subtrahenden addiert, aber der Übertrag in die 9te Stelle wird verworfen:
01111011
+11110101
------------
(1)00010000 (edit SlaterB: oder (1)01110000 ? )
Die Formel beschreibt das dadurch, dass der Wert für die 9te Stelle (Also die nächste nach der definierten Länge) wieder abgezogen wird.
die angegebene Formel hat aber ihre eigenen Schönheiten, ist unabhängig von der Anzahl der Ziffern,
die Umwandlung von -S zu +(B^n - S) - B^n ist vollkommen natürlich korrekt, ohne Konventionen wie ein Bit für Negation zu benötigen
interessant wird es wenn das Ergebnis negativ wird, umdreht müsste es lauten:
danke für deine Anmerkungen auch wenn ich sie nicht ganz verstehe^^
Da ich sowieso nur mit dem Skript aus dem Vohrjahr vorlerne ist es jetzt eh nicht so wichtig. Ich bin mal gespannt ob ich es in der Vorlesung besser verstehe,
da ich verbale Erklärungen oft besser verstehe als wenn ich mir selber etwas durchlese.
Ansonsten bleibe ich bei dem Verfahren von Timothy da es mir einfacher erscheint