Christian Seiler: C++: Register Überlauf beim Rechnen abfangen

Beitrag lesen

Hallo,

Wie kann ich in C++ einen Überlauf-Fehler abfangen, wie er z.B. bei der Berechnung einer Fakultät recht schnell auftritt?

Den Link zu Fefes Eintrag hast Du ja schon bekommen. Ansonsten: Geht nicht in C++.

Kann man die Flags abfragen? Aber dazu müsste man wissen, welches Register als Zielregister beio der Multiplikation benutzt wird und außerdem sollte das in einer Hochsprache auch deren Sachen sein?!

C und C++ definieren einen Integer-Überlauf als "undefiniertes Verhalten", d.h. was dann tatsächlich passiert, ist nicht klar. Wenn es irgendwo eine Platform + einen Compiler gäbe, bei der nach einem überlauf die Integervariable immer 42 enthalten würde, wäre das vollkommen legal nach dem C- oder C++-Standard.

Und genau aus dem Grund kann man das auch grundsätzlich in C oder C++ nicht abfangen: Beide Sprachen setzen nämlich nicht voraus, dass es überhaupt so etwas wie ein Flag für den Überlauf gibt! Ich weiß nicht, ob sowas in der Realität tatsächlich existiert, aber es wäre zumindest theoretisch problemlos denkbar, einen vollkommen standardkonformen C++-Compiler für eine Platform zu schreiben, die sowas gar nicht im Prozessor abfangen *kann*.

Man kann das jetzt natürlich als Designschwäche sowohl von C als auch von C++ ansehen, aber das ändert nichts an der Tatsache, dass das, was Du willst, nicht möglich ist.

Von Inline-Assembler würde ich übrigens DRINGENST abraten - es ist nämlich nicht gesagt, dass ein Compiler auf x86 tatsächlich ein MUL erzeugt bei einer Multiplikation - wenn der Compiler optimiert, darf er auch komplett andere Anweisungen generieren, die ihm schneller oder für den Prozessor besser geeignet erscheinen. Außerdem verliert man dadurch die Portabilität.

Viele Grüße,
Christian