Hallo, bin an einem Projekt mit avr-gcc (GCC) 3.4.3 und habe das Problem, dass ich, egal wie groß ich den int-typ wähle, immer die Fehlermeldung "integer overflow in expression" erhalte. Der Code (Fragment) sieht so aus: unsigned long KP_A; KP_A=365*1957; LCD_Print(0,4,"%i",KP_A); Muss ich im mfile noch irgendwas einstellen, damit der compiler den unsigned long akzeptiert? Der Fehler kommt ab einer Größe KP_A von > 2^15. Bin ratlos, möglichweise seh ich den Wald vor Bäumen nicht. Gruß Frank
Berechnungen mit konstanten Werten werden grundsätzlich in int durchgeführt, wenn nicht explizit angegeben wird, dass ein anderer Wertebereich genutzt werden soll. Dementsprechend wird auch "365*1957" immer in int gerechnet, da beide Zahlenwerte als int angegeben sind. Das was links vom Zuweisungsoperator steht, spielt überhaupt keine Rolle, weil die Zuweisung (und eventuelle Erweiterung oder Reduktion auf einen anderen Datentyp) erst nach der Berechnung durchgeführt wird. Wenn Du rechts ein long -Resultat haben willst, musst Du mindestens einem der beiden Operanden ein L oder UL anhängen, also z.B.
1 | KP_A=365*1957UL; |
Hallo, hatte vergessen zu erwähnen, dass es sich nicht um Konstanten handelt, sondern vielmehr um Variable, die im realen Fall Werte der dargestellten Größen annehmen können. Gruß Frank
Frank wrote: > hatte vergessen zu erwähnen, dass es sich nicht um Konstanten handelt, > sondern vielmehr um Variable, die im realen Fall Werte der dargestellten > Größen annehmen können. Und welchen Datentyp haben die Ausgangsvariablen? Da musste, wenn keine der beiden groß genug ist, auch mindestens eine nach unsigned long konvertieren...
1 | unsigned int a, b; |
2 | unsigned long KP_A; |
3 | // ...
|
4 | KP_A = (unsigned long) a * b; |
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.