mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik overflow bei miltiplikation


Autor: Rolf Riller (ultra-low)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in ein "integer" passt max. 65536

Otto

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ein uint ist ein unsigned int....

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Otto

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

gruß hans

Autor: A. K. (prx)
Datum:

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

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok - hast ja recht.....

Autor: Rolf Riller (ultra-low)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Riller (ultra-low)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
super, danke.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.