Ü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.


  • Mod

    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;
    }
    

  • Mod

    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 😉


  • Mod

    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).


Anmelden zum Antworten