Bitshift + long geht nicht (WinAVR)

Gast #649279
Lesenswert?
• ▲
▼
Hab hier ein seltsammes Verhalten des GCC-Compilers:
1
unsigned long Var;
2

3
Var = 1 << 24; // Compiler: warning: left shift count >= width of type

Die Zeile mit dem Bitshift wird immer rausgeworfen, egal wie der 
Optimizer eingestellt ist.

Die Variable REG ist aber definitiv 4Byte lang, im Disassembler ist zu 
sehen, dass 4Bytes angelegt werden.

Hat jemand eine Idee woran das liegen kann?

Danke
ABu
#649281
Lesenswert?
• ▲
▼
@ ABu (Gast)

>Var = 1 << 24; // Compiler: warning: left shift count >= width of type

Ein Klassiker. Versuchs mal damit.

Var = 1L << 24;

>Die Variable REG ist aber definitiv 4Byte lang, im Disassembler ist zu
>sehen, dass 4Bytes angelegt werden.

Ja, aber die Konstante 1 wird als 16 Bit INT gewertet ;-)

MfG
Falk
Gast #649284
Lesenswert?
• ▲
▼
Es ist eigentlich ganz richtig, dass du dies im Assembler Code nicht 
findest, da ja der Präprozessor bereits diese Shiftoperation umsetzt. 
Eigentlich willst du ja nichts anderes als der Variable den Wert 
0x1000000 zuweisen und genau das erkennt der Präprozessor und setzt dies 
gleich in den oben genannten Wert um.
Moderator Persönliche Seite #649307
Lesenswert?
• ▲
▼
sch_michael wrote:

> ..., da ja der Präprozessor bereits diese Shiftoperation umsetzt.

Das fällt in den Bereich `urban legend'.

Der Präprozessor ersetzt Texte, und zwar alle die, die mittels
#define in einem Makro definiert worden sind, und er zieht die
#include-Dateien rein.  Mehr macht er nicht.

Das hier ist teil des Optimierers im Compiler.  Es bewirkt eine
Ersetzung von Ausdrücken, die zur Compilezeit konstant sind, durch
ihre Äquivalenten Rechenergebnisse.

Aber selbst ohne Optimierung wäre hier nichts anderes herausgekommen
(da die Rechnung ja im 16-bittigen Bereich gemacht worden ist), es
hätte nur länger gedauert. ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren