Forum: Compiler & IDEs integer overflow in expression.


von Frank (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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;

von Frank (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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;

von Frank (Gast)


Lesenswert?

vielen vielen Dank erstmal, jetzt wird getestet.

Gruß

Frank

von Frank (Gast)


Lesenswert?

nu hab ichs.

DANKE

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
Noch kein Account? Hier anmelden.