Forum: Mikrocontroller und Digitale Elektronik overflow bei miltiplikation


von Rolf R. (ultra-low)


Lesenswert?

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

von Otto (Gast)


Lesenswert?

in ein "integer" passt max. 65536

Otto

von Johannes M. (johnny-m)


Lesenswert?

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...

von Johannes M. (johnny-m)


Lesenswert?

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

von hans (Gast)


Lesenswert?

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

von Otto (Gast)


Lesenswert?

ein uint ist ein unsigned int....

von hans (Gast)


Lesenswert?

@Otto

dann wären es aber  max. 65535 (2^16 -1) !

gruß hans

von (prx) A. K. (prx)


Lesenswert?

Der Typ links vom "=" ist hier völlig irrelevant. Das Problem ist rechts 
davon.

von Otto (Gast)


Lesenswert?

ok - hast ja recht.....

von Rolf R. (ultra-low)


Lesenswert?

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....

von Johannes M. (johnny-m)


Lesenswert?

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.

von Rolf R. (ultra-low)


Lesenswert?

super, 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.