Gibt es eine Möglichkeit zu testen ob eine Summe > INT_MAX/UINT_MAX ist
-
Hallo,
Wie der titel schon sagt :Gibt es eine Möglichkeit dieses festzustellen und wenn ja welche?
Ein Link täte evtl. auch reichen.
Gruß
FencerPs: Google habe ich schon befragt und leider nichts gescheites gefunden. Wenn jemand das richtige suchwort kennt: Asche über mein haupt.

-
Na ja, etwas aufwaendig waeren folgende Vorschlaege:
- alles nach long long/float/double oder einen anderen groesseren Datentyp casten und dann ueberpruefen
- durch eine andere Zahl (z. B. 1000) dividieren und schauen ob das groesser ist als INT_MAX/1000 (geht natuerlich nur wenn (a) die Ueberschreitung groesser ist als das was du wegkuerzt aber gleichzeitig (b) du dir sicher sein kannst dass die Summe nach dem Kuerzen INT_MAX immer noch nicht ueberschreitetAber wenn du mit Summen hantierst, bei denen du riskierst, dass sie INT_MAX ueberschreiten, warum greifst du nicht gleich zu einem groesseren Datentyp?
-
Ein vorzeichenbehafteter Überlauf resultiert in undefiniertem Verhalten. Bei vorzeichenlosen Werten ist beim Überlauf die Summe kleiner als die beiden Summanden.
-
Also ohne jetzt große C++ Kenntnisse zu haben, so sollte trotzdem die Summe zweier Zahlen bei Bereichsüberschreitung immer kleiner sein, als das Minimum der Summanden.
Ciao
Timo
-
horscht2999 schrieb:
Also ohne jetzt große C++ Kenntnisse zu haben, so sollte trotzdem die Summe zweier Zahlen bei Bereichsüberschreitung immer kleiner sein, als das Minimum der Summanden.
Ciao
TimoWenn beide Summanden positiv sind... und vorzeichenlos. Zwei negative Summanden können ebenfalls in einem Überlauf resultieren, bei modulo-2^n-Arithmetik und Zweierkomplementdarstellung resultiert das in einer Summe, die größer als beide Summanden ist. Vorzeichenbehafteter Überlauf ist aber wie erwähnt undefiniert (und zumindest gcc macht sich das in neueren Versionen zunutze) - also kann man das gar nicht prüfen.
Abgesehen davon ist das Prüfen auf Überlauf trivial, wenn man einfach die entgegengesetzte Operation untersucht:
a+b>INT_MAX <==> a>INT_MAX-b
-
Okay da ich erst jetzt den Beitrag von camper gesehen habe schränke ich das auf vorzeichenlose ints ein. Wobei es bei vorzeichenbeahfteden ints, so sein müsste, dass die Summe, bei Überschreitung entweder kleiner als das Minimum der Summanden oder größer als das Maximum der Summanden ist.
Aber diese Überlegungen kommen nicht aus dem Wissen über C++ sondern aus der Lehre der Addition von Binärzahlen.Ciao
Timo
-
Dank dir Camper (und natürlich auch allen anderen).

grad bei so trivialen dingen steh ich manchmal echt auf dem schlauch.Gruß Fencer