hallo kann mir bitte jemand dieses verhalten erklären: ------- uint32_t var_1; var_1 = (9999 * 10); fehlermeldung: ../programm.c:437: warning: integer overflow in expression -------- uint32_t var_1; var_1 = 99990; keine fehlermeldung. -------------- compiler: WinAVR-20081205 gruss
Rolf Riller wrote: > kann mir bitte jemand dieses verhalten erklären: > ------- > > uint32_t var_1; > var_1 = (9999 * 10); > > fehlermeldung: ../programm.c:437: warning: integer overflow in > expression Ja, das ist ein beliebter Anfängerfehler. Solche Operationen werden, so lange alle beteiligten Werte in einen int reinpassen, auch in int gerechnet. Dass das Ergebnis nicht in einen int passt, interessiert den Compiler nicht. Wenn der Programmierer weiß, dass das Ergebnis nicht in einen int passt, dann muss er dafür sorgen, dass zumindest einer der beiden Operanden vor der Operation in einen ausreichend großen Datentyp konvertiert wird. > uint32_t var_1; > var_1 = 99990; > > keine fehlermeldung. Oh Wunder... 99990 passt ja auch nicht in einen int. Und es wird auch nix grechnet...
Otto wrote:
> in ein "integer" passt max. 65536
Nö. Ein int hat in einem System, bei dem int 16 Bit breit ist, einen
Wertebereich von -32768...32767
Der Compiler sieht 9999 und denkt an INT16, er sieht 10 und denkt INT16. Er Multipliziert und sieht Overflow. Da het er recht. Cast mal die 9999 auf uint32_t und der Compiler sieht was du willst. gruß hans
Der Typ links vom "=" ist hier völlig irrelevant. Das Problem ist rechts davon.
das war eigentlich so gedacht #define wert (9999 * 10) uint32_t var_1; var_1 = wert; ich weiss man könnte auch "#define wert 99990" schreiben aber übersichtshalber bräcuhte ich es so....
Rolf Riller wrote: > das war eigentlich so gedacht > > #define wert (9999 * 10) Das muss dann eben 9999UL * 10 heißen. Oder 9999 * 10UL. Wie gesagt, wenigstens einer der Operanden muss einen ausreichend großen Typ haben.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.