Überlauf integer float



  • Hi Community

    Ich habe mal ne allgemeine Frage, was passiert bei einem Überlauf und einem Unterlauf bei integer und float ? Also ich weiss das ein Überlauf , ein verlassen der Wertgrenze ist , doch was dort geschieht möchte ich noch lernen. Ein erklärung wäre nett .

    Danke 🙂



  • Für jeden dieser beiden Typen ist ja Speicher reserviert, den du auch nicht ohne weiteres verlassen kannst.
    Daraus folgt wenn du Beispielsweise der einfach heit halber ein vorzeichenlosen 8Bit integer Wert hast, dieser maximal 255 (1111 1111) annehmen kann. Wenn du was drauf addieren würdest, würde ein Überlauf in dem Sinne entstehen, dass er wieder auf 0 gesetzt wird und und den Rest addiert. 255 (1111 1111) + 2 (0000 0010) wäre dann also 1 (0000 0001). Glaube so in der Art müsste es richtig sein 🙂



  • Dank dir oneil5000 , habe es jetzt verstanden ( für integer ).
    Was passiert aber beim überlauf bei floats ?? und wie kann ein unterlauf bei integer und floats passieren ?



  • Bei float ist es dasselbe wie beim integer. Und bei einem Unterlauf passiert das Gegenteil vom Überlauf. Wenn du die negativste Grenze vom int oder float erreicht hast, fängt er wieder bei der maximalsten an.
    Probier es doch einfach in einem kleinen Programm aus!



  • Ok ich habe dasmit dem Unterlauf und Überlauf getestet ( bei short ) , mit 32767 ist die Grenze . Doch was passiert bei floats die haben immer so komische bezeichnungen 1E-27 oder was wiss ich was ... könntest du mir erklären wie das bei floats ist. Danke nochmals für dein Verständnis



  • 1e-27 ist Exponentialschreibweise. Alles was du so zum float wissen musst kannst du hier nachlesen.

    Und falls ich dir zuviel Müll erzählt habe ;), auch nochmal unter diesen beiden links Informieren
    http://de.wikipedia.org/wiki/Arithmetischer_Überlauf
    http://de.wikipedia.org/wiki/Arithmetischer_Unterlauf



  • oneill5000 schrieb:

    Probier es doch einfach in einem kleinen Programm aus!

    Das ist niemals eine gute Idee, wenn man portable Programme schreiben will.

    Bei vorzeichenbehafteten Integern ist ein Überlauf Undefined Behavior. Es kann zwar sein, dass man irgendwo unten wieder ankommt, wenn man den Wertebereich oben verlässt, genauso kann aber das Programm abstürzen oder schlimmeres passieren.

    Nur bei vorzeichenlosen (unsigned) Integern kann es keinen Überlauf geben, es wird immer einfach modulo Maximalwert+1 gerechnet. D.h. man kann sich darauf verlassen, dass UINT_MAX + 1 == 0 ist.



  • Bei einem Testprogramm ist es völlig egal ob es nun mal abstürzt oder nicht. Noch dazu lässt sich mit komfortablen Entwicklungsumgebungen wie Visual Studio beim debuggen oder anschauen vom Assembler code (bei kleinen Operationen) bis ins kleinste Detail gehen. Deswegen denke ich schon das ein Testprogramm eine gute Lösung ist.



  • Aber wenn man nicht gerade nur Programme für eine ganz bestimmte Plattform schreiben will, sollte man sich nicht auf das verlassen, was man meint durch Ausprobieren herausgefunden zu haben, sondern besser gleich z.B. im Standard nachgucken.

    Und selbst wenn man für eine bestimmte Platform programmiert, ist es sinnvoll, die zugehörige Dokumentation zu lesen.



  • Habe ich auch damit nicht ausgeschlossen 😉 Und du hast natürlich auch Recht.


Log in to reply