mikrocontroller.net

Forum: Compiler & IDEs Fehler im avr-gcc beim Berechnen von Konstanten


Autor: Martin Laabs (mla)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

übersetzt man folgenden Code mit dem avr-gcc (ich benutze avr-gcc (GCC) 
3.4.6) erhält man folgende Fehlermeldung:

[pre]
bash:/tmp$ avr-gcc test.c -Wall
test.c:4: warning: left shift count >= width of type
[/pre}

Code:
[c]
#define _AVR_ATmega8_ 1
#include <stdint.h>

uint32_t N=(1<<20);

int main()
{
while(1);
}
[/c}

Das ist ganz offensichtlich totaler Blödsinn, da 1<<20 locker in einen 
32-Bit Datentyp passen würde. Leider ist es aber eben nicht nur eine 
Warnung -sondern der Typ wird tatsächlich auch falsch berechnet - weil 
nach dem 16. Bit abgeschnitten.

Kann mir jemand diesen Fehler, vielleicht mit einem etwas neuerern 
Compiler, bestätigen?

Danke,
 Martin L.

PS: Warum gehen die Formatierungen nicht?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin L. wrote:

> Kann mir jemand diesen Fehler, vielleicht mit einem etwas neuerern
> Compiler, bestätigen?

Ich kann dir bestätigen, dass dies kein Compilerfehler ist.

Die Konstante 1 ist vom Typ "int", und da der nur 16 Bits umfasst ist 
1<<20 ebenfalls vom Typ "int". Und damit 0.

Der Compiler hat dich freundlicherweise auch darauf hingewiesen.

Für die Auswahl des korrekten Datentyps bist du selbst verantwortlich. 
Also schreib 1L<<20.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin L. wrote:

> PS: Warum gehen die Formatierungen nicht?

Mit eckiger statt geschweifter Klammer geht es wohl schon.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Merke: Nicht an allem was nicht gleich funktioniert sind andere schuld. 
Nicht der Compiler und nicht der Webserver.

Autor: Martin Laabs (mla)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Kaiser wrote:
> Martin L. wrote:
>
>> PS: Warum gehen die Formatierungen nicht?
>
> Mit eckiger statt geschweifter Klammer geht es wohl schon.

Sind doch eckige Klammern [[[[ ]]]]]

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Diese beiden auch: [/c} ?

Autor: Martin Laabs (mla)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Kaiser wrote:
> Martin L. wrote:
>
>> Kann mir jemand diesen Fehler, vielleicht mit einem etwas neuerern
>> Compiler, bestätigen?
>
> Ich kann dir bestätigen, dass dies kein Compilerfehler ist.
>
> Die Konstante 1 ist vom Typ "int", und da der nur 16 Bits umfasst ist
> 1<<20 ebenfalls vom Typ "int". Und damit 0.

Ah - ich verstehe. Der Compiler bezieht diese Fehlermeldung nicht auf 
den Zieldatentyp (N) sondern auf die Zwischenwerte die er erst nach der 
Berechnung auf den Zielwert castet. Ich dachte es wäre andersherum.

Vielen Dank,
 Martin L.

Autor: Martin Laabs (mla)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Kaiser wrote:
> Diese beiden auch: [/c} ?

Ja - genauso eckig.  Bin ich jetzt schwer von Begriff oder sind meine 
eckigen Klammern andere als Deine?

Viele Grüße,
 Martin L.

Autor: Andreas K. (a-k)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sowohl als auch.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin L. wrote:
> Andreas Kaiser wrote:
>> Diese beiden auch: [/c} ?
>
> Ja - genauso eckig.  Bin ich jetzt schwer von Begriff oder sind meine
> eckigen Klammern andere als Deine?

Du musst schon einen ziemlich merkwürdigen Zeichensatz verwenden, wenn 
bei dir [/c} und [/c] gleich aussehen.

Autor: Martin Laabs (mla)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK - ich verstehe. Ich hatte mich bei den schließenden Klammern vertippt 
und bei mir sehen die geschweiften Klammern den Eckigen wirklich zum 
Verwechseln ähnlich ... also fast gleich ...
Ist halt ein alter Röhrenmonitor...

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.