Probleme mit Übertrag bei Addition...
-
Moin,
sitze gerade über ´nem Problem, dass ich einfach nicht gelöst bekommen...
Wir haben von unserem Prof die Aufgabe, eine Klasse für beliebig lange Zaheln zu schreiben.... Das klappt bisher auch ganz gut wenns ums kopieren, speichern und lesen geht. Das Problem liegt jetzt bei den mathematischen Funktionen.
Ich will jetzt zwei Zahlen addieren. Die sind noch relativ klein gehalten um das ganze überschaubar zu halten. Beim addieren habe ich nun folgenden Teilcode:buffer.Segment[0].low = 0; buffer.Segment[0].high = 0; for(int i = 0; i < ergSize; i++){ buffer.Segment[0].high = buffer.Segment[0].low; // Übertrag holen buffer.Segment[0].low = 0; // Speicher für Übertrag zurück setzen buffer.Segment[0].high = buffer.Segment[0].high + _Digits[ergSize-1-i] + n2._Digits[ergSize-1-i]; // Übertrag + Zahl1 + Zahl2 erg._Digits[ergSize-i-1] = buffer.Segment[0].high; // Ergebnis schreiben } if(buffer.Segment[0].low != 0){ // Falls ein Übertrag ganz vorne steht, // wird das Ergebnis um ein Byte verlängert und alles // um ein Byte nach rechts geschoben. Übertrag schreiben. erg.setSize(ergSize+1); erg._Digits[0] = buffer.Segment[0].low; }Dabei ist buffer ein union (Vorgabe), erg ist ein Objekt in dem das Ergebnis gespeichert werden soll und _Digits ist ein Pointer auf den Anfang der zu speichernden Zahl. Im Prinzip werden immer zwei Zahlen inkl. Übertrag der letzten Rechnung addiert, wobei der evtl. Übertrag ein Byte weiter vorne im union gespeichert wird. Das union besteht (einfach gesagt) aus 4 unsigned chars (= 4 bytes). Ich benutze aber nur zwei Bytes, wobei auf dem letzten Byte die Berechnungen laufen und Überträge generell auf dem davor landen.
Das funktioniert so auch wunderbar, bis auf den Übertrag nach jedem zweiten Byte!!! Unser Prof erwähnte da mal, dass es da Prozessorintern unterschiede gibt - so wegen BigEndian und LittleEndian. (Ich hab `n Intel...)
Die Ergebnisse und auch die einzelnen Zahlen lasse ich mir Hexadezimal ausgeben.
Als Beispiel:
75BCD15
+ 1E240
=75DAF55
Das wäre richtig, aber nach dem zweiten Byte macht meine Rechnung da Probleme und gibt als Ergebnis 75CAF15 aus.....Hat da jemand ´ne Lösung für?
Schonmal Danke, woll?