www.mikrocontroller.net

Forum: Compiler & IDEs integer overflow in expression.


Autor: Frank (Gast)
Datum:

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

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

Bewertung
0 lesenswert
nicht 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.
KP_A=365*1957UL;

Autor: Frank (Gast)
Datum:

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

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

Bewertung
0 lesenswert
nicht 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...
unsigned int a, b;
unsigned long KP_A;
// ...
KP_A = (unsigned long) a * b;

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen vielen Dank erstmal, jetzt wird getestet.

Gruß

Frank

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nu hab ichs.

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.