Forum: Compiler & IDEs Bitshift + long geht nicht (WinAVR)


von ABu (Gast)


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

von Falk B. (falk)


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

von sch_michael (Gast)


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.

von ABu (Gast)


Lesenswert?

Prima -Danke!

ABu

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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. ;-)

von Karl H. (kbuchegg)


Lesenswert?

sch_michael wrote:

> 0x1000000 zuweisen und genau das erkennt der Präprozessor und setzt dies
> gleich in den oben genannten Wert um.

Um genau zu sein macht das nicht der Präprozessor sondern
der Compiler selbst.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.