Addition von positiven und negativen Zahlen auf Bitebene
-
Hallo,
ich habe mir mal Gedanken zu folgender Aufgabe gemacht:
Man Überlege sich ein Verfahren, das auf Bitebene 2 Zahlen in der Darstellung durch Betrag und Vorzeichen korrekt addiert. Zahlen können auch negativ sein.Zunächst denk ich, es ginge in der Darstellung von Betrag und Vorzeichen:
[d]BV: -5≡[1101] und 5≡[0101]
Nun die Rechnung -5+5:
[1101]
+[0101]
--------
[10010]≡-2 also geht dies doch nicht, oder was habe ich vlt. hier schon falsch gemacht?Somit überlegte ich weiter, es gibt ja noch die Ein-Komplement-Darstellung, dass dumme dort ist aber es gibt 2 Nullen, also auch nciht das wahre, somit komme ich auf die Zwei-Komplement-Darstellung. Bsp.:
-8≡[01000]2
4≡[0100]
-8+4:
[01000]2
+[00100]
---------
[01100]2≡-4 Stimmt das? Habe es so überprüft:
Falls [01100]2 -4 sein soll, dann gehe ich den Weg der Konvertierung rückwerts [1100]2-1=[0100]=4Was wäre bei (-2)+(-2)?
Bin dabei ein bisschen verwirrt, weil ja in der Aufgabe steht, dass man das Ganze mit der Darstellung durhc Betrag und Vorzeichen machen soll. Blos im Internet stand am Ende bis jetzt immer die Methode der Zwei-Komplement-Darstellung.
Vielen Dank für eure Hilfe
Storm
-
Es gilt:
-n = (~n)+1
Wobei n eine positive Ganzzahl ist.Also ist 2 zum Beispiel [0010] und -2 [1110]. Wenn man die zusammenzählt gibt es dank Overflow [0000].
Geometrisch gesehen sind Ganzzahlen wie der Rechner sie kennt ja auch keine 1 dimensionalen Vektoren auf einer Geraden sondern vielmehr auf einem Kreis da die Anzahl der Bits festgelegt ist.
Eine ganze Runde ist das gleich wie keine Runde. 2+(-2) stellt nicht keine Runde dar sondern eine ganze, da dies aber auf das gleiche Resultat herauskommt.
-
IMHO muß du Betrag und Vorzeichen separat berechnen. Bei unterschiedlichen Vorzeichen der beiden Argumente mußt du dann die Größe der Beträge berücksichtigen ... Evtl. brauchst du auch noch ein "end around carry".
-
fubar schrieb:
IMHO muß du Betrag und Vorzeichen separat berechnen. Bei unterschiedlichen Vorzeichen der beiden Argumente mußt du dann die Größe der Beträge berücksichtigen ... Evtl. brauchst du auch noch ein "end around carry".
Und eben dies stimmt nicht. Es handelt sich um genau den gleichen Processorbefehl um vorzeichenbehaftete und vorzeichenlose Zahlen zusammen zu zählen.
-
Ich glaube seine Äußerung bezog sich auf den OP und nicht auf Deine Nichtlösung.
Nichtlösung, weil Du n#mlich Einerkomplement verwendest und keine Betrag-Vorzeichen-Darstellung.
-
Vielleicht hilft dir dieses Skript ein wenig:
http://lrs2.fmi.uni-passau.de/skripten/WS03-04/TI2_Vorl_3.1_Zahlen_und_Arithmetik_WS_03_04.pdf
-
@fubar Schönes Script Danke
Diesen Gedanken mit derFallunterscheidung hatte ich auch am Anfang, aber als ich dann anfing zu überlegen wie man dies dann im Rechner realisiert, empfand ich es als sehr umfangreich und kompliziert, somit verwarf ich diese Idee wieder. Aber nun war es doch die Richtige:)
Wenn ich einen Algorithmus mache, muss dieser dann also die ganzen Fallunterscheidungen machen um zu erkenne was gemacht werden soll...Werd dies jetzt mal weiter ausarbeiten...
Komme aber vielleicht später noch mal wieder, muss nämlich noch einen Algorithmus finden, welcher eine Zahl im Einer-Komplement-Darstellung mit 2 multipliziert( VZ beliebig) und diesen dann noch beweisen. Aber mal sehen wie dies so klappt
Bis denne
Danke
Storm
-
Hallo,
habe nun doch noch ein paar kleine Fragen zu der Multiplikation mit 2, habe mal meine Schritte dokumentiert:
http://img142.imageshack.us/img142/9392/aufgabe21pm.pngVielen Dank
Storm
-
Ehm, wenn ich einen bescheidenen Einwand vorbringen darf:
Die Multiplikation einer Zahl n im Zahlensystem b mit b^x ist grundsätzlich das Linksschieben der Zahl n um x.Kurz gesagt: 100110 x 2^2 = 10011000, oder im 10er System: 14 x 10^3 = 14000
Auf diese Weise sind schließlich die Stellen in einem Stellenwertsystem (heißt das so?) definiert.
Bei den Additionen kannst du übrigens nicht so einfach mit signed Zahlen arbeiten, wenn du nicht die Kapazität des Speichers betrachtest.
Wenn du also einen Speicher von 4 bit betrachtest, hast du alle Zahlen von -8 bis 7, also eine Kapazität von 16. Den Wert einer negativen Zahl im Speicher erhält man mit Kapazität - Zahl, also 16 - 5 = 11 = [1011] (oder mit ~n+1).[0101] +
[1011]
------
[0000] + overflow von [10000]Wie Ben04 schon sagte sind die Zahlen zyklisch angeordnet, d.h. mit nem Overflow von "Kapazität" (in diesem Falle also [10000] = 16) geht man zwar einmal um den "Zahlenkreis" herum, kommt aber trotzdem wieder zum selben Wert wie ohne Overflow, also [0000].