Überlauf bei Multiplikation ermitteln



  • Hi,

    ich hab momentan folgendes Problem:

    Gegeben sind 2 zu multiplizierende Ganzzahlen

    uint32 a, b;
    

    Das Ergebnis ist rein mathematisch gesehen vom Typ uint64. Der entstehende Überlauf wird ja verworfen, da der Ausdruck

    a * b
    

    ebenfalls vom Typ uint32 ist. Wie komme ich nun an die oberen 32 Bit des Ergebnisses? Zwei Bedingungen müssen dabei aber erfüllt werden:
    1. keine Verwendung von Inline Assembler
    2. keine Multiplikation über grössere int Typen, also zB

    uint64 c = a, d = b;
    uint64 ergebnis = c * d;
    

    Wenn das eher mathematischer Natur ist, dann bitte verschieben.



  • Also, wenn du zwei unsigned Zahlen multiplizierst, kommt bei Überlauf wohl (wie bei der Addition) zunächst eine sehr kleine Zahl im jeweiligen Bereich raus - korrigiert mich.

    Wenn das der Fall sein sollte, multiplizierst du einfach, und prüfst, ob das Ergebnis kleiner ist als einer der beiden Faktoren, und dann kannst du davon ausgehen, dass ein Überlauf stattfand.

    Ob das so stimmt kann ich nicht 100%-ig beschwören, und wie du dann richtig multiplizierst ... Keine Ahnung

    Es wird aber irgendwie darauf hinauslaufen, dass du die beiden Zahlen irgendwie in kleine Häppchen zerlegen musst, damit du im Zahlenbereich bleibst und ein Teil der höherwertige, der andere der niederwertige sein wird.



  • Mir gehts eigentlich nicht darum, Überlauf zu erkennen oder vorzubeugen. Ich will direkt den Wert des Überlaufs haben.


Anmelden zum Antworten