integer overflow in expression.

Gast #834626
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
#834631
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;
#834640
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;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren