Überlauf bei Zählern mit int-Typen feststellen
-
Hi
Ich habe eine Struktur dieser Art:
unsigned long counter; while (true) { if (irgendwas) counter++; if (was_anderes) break; }Wie kan ich merken, wenn counter übergelaufen ist, ohne jedes Mal explizit zu prüfen (mittels Größenvergleich oder logischem AND) ?
Werde das Gefühl nicht los, das das passiert weil ich hier merkwürdige Ergebnisse erhalte.
Danke & Grüße,
Benjamin
-
Plattformabhängig: Carry-Bit prüfen
Mit C++: Testen ob die neue Zahl kleiner als die vorherige ist.
-
für ganz korrekte: counter auf maximum (std::numeric_limits) prüfen, bevor der counter inkrementiert wird, alles andere findet (formal) in UB land statt.
-
camper schrieb:
für ganz korrekte: counter auf maximum (std::numeric_limits) prüfen, bevor der counter inkrementiert wird, alles andere findet (formal) in UB land statt.
Das läuft dann aber auf eine ständige Abfrage hinaus ?
unsigned long counter; while (true) { if (irgendwas) if (counter < unsigned_long_max) {// genaue Syntax is mir grad entfallen counter++; } else { cout << "Hilfe, Überlauf ;-)"; } if (was_anderes) break; }
-
Benja_m schrieb:
Das läuft dann aber auf eine ständige Abfrage hinaus ?
immer dann, wenn ein überlauf stattfinden könnte.
-
ein überlauf kann potentiell immer auftreten, wenn der counter erhöht wird. der counter wird in ~90% der fälle erhöht. also ziemlich oft

-
Benja_m schrieb:
ein überlauf kann potentiell immer auftreten, wenn der counter erhöht wird. der counter wird in ~90% der fälle erhöht. also ziemlich oft

dann musst du auch sooft prüfen, wenn du daran interessiert bist, ihn zu verhindern. nun ist dieser test ja nicht aufwendiger als den überlauf festzustellen, wenn er eingetreten ist - insofern kein problem. häufig genug kann man sich das aber auch sparen: auf den meisten plattformen werden überläufe ignoriert und man kann änderungen durch differenzbildung (was den überlauf für vorzeichenlose typen egalisiert) erkennen. oder man benutzt grosse 64bit integer: die werden in der praxis nicht überlaufen (nimm einen computer mit 2^32 Hz takt an und eine erhöhung je takt, dann dauert es immer noch ~136 jahre bis zum überlauf).