Fehler im avr-gcc beim Berechnen von Konstanten

Gast #928318
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?
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.
Gast
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 [[[[ ]]]]]
Gast
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.
Gast
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.
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.
Gast
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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.