Forum: Compiler & IDEs "overflow in expression" mit Konstanten


von pumpkin (Gast)


Lesenswert?

hallo forum,

ich hab eine kleinigkeit. mein compiler wirft eine warnung die 
folgerndermaßen aussieht:

> ../function_generator.c:1160: warning: integer overflow in expression


der code dazu:

> if(ptr_ch_1 >= (ARRAY_LENGTH * STRETCH_VALUE) )
>     ptr_ch_1 -= ARRAY_LENGTH * STRETCH_VALUE;

wobei ptr_ch_1 ein unsigned integer ist und ARRAY_LENGTH und 
STRETCH_VALUE per define vereinbart sind:

> #define ARRAY_LENGTH    10240
> #define STRETCH_VALUE   4

nun ist 10240 * 4 = 40960 !E von integer, soviel ist klar. aber da es 
ein unsigned typ ist, ist es E von unsigned integer. weiss das der 
compiler nicht wenn er die warnung wirft (also nimmt er signed integer 
an) oder woran stößt er sich?

pumpkin

von Joe D. (kosmonaut_pirx)


Lesenswert?

hallo,
die defines werden ja einfach so ersetzt. ergo würde ich, wenn ich der 
compiler wäre, dass dann so schreiben:

>if(ptr_ch_1 >= (10240 * 4) )

usw.
also sind's konstanten und lt. k&r vom typ int.

schreib mal am ende der macro's ein 'u', dann sollten sie als unsigned 
behandelt werden.
bye kosmo

von A.K. (Gast)


Lesenswert?

Der Ausdruck (ARRAY_LENGTH * STRETCH_VALUE) ist vom Typ "int". Was drum 
herum steht interessiert des Compiler bis dahin nicht. Erst das Ergebnis 
diser Rechnung wird in "unsigned" umgewandelt, aber dann ist es bereits 
zu spät.

von pumpkin (Gast)


Lesenswert?

ok, das macht sinn. dachte es bezieht sich auf die zuweisung. K&R hab 
ich leider nicht zur verfügung, ist langsam mal ne überlegung wert.

danke
pumpkin

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.