Forum: Compiler & IDEs Bug beim Shiften im AVR-GCC?


von mr.chip (Gast)


Lesenswert?

Hallo


Aus (x >> y) macht der AVR-GCC im wesentlich folgenden Assembler-Code:
1
+0000098C:   9535        ASR     R19              Arithmetic shift right
2
+0000098D:   9527        ROR     R18              Rotate right through carry

Nicht ganz vollständig, aber es geht ja auch nur um die erste Zeile:

ASR schiebt bitweise nach rechts, wobei das MSB konstant bleibt. Nun 
ergibt sich ein echtes Problem:
1
x = 0b10000000;
2
y = 3;
3
4
(x >> y) = 0b11110000;

anstatt, wie ich es gerne hätte und auch erwarten würde
1
(x >> y) = 0b00010000;


Ist das ein Fehler im GCC oder muss das so sein? Wie könnte ich das 
umgehen, so dass ich meine normale Shift-Funktion bekomme?

Gruss

Michael

von Karl H. (kbuchegg)


Lesenswert?

wie ist x definiert?
bei einem signed int, also

   int x;

ist das genau das Verhalten, das man erwarten würde.

was du haben willst, wäre das Ergebnis, wenn

  unsigned int x;

definiert ist.

von mr.chip (Gast)


Lesenswert?

Manchmal staunt man, wenn einem um diese Zeit noch in rekordverdächtigen 
4 Minuten geantwortet wird, und zwar so gut, dass man das Problem lösen 
kann!

x war vorhin ein char, da es mir rein nur um das Bitfeld in x ging, 
nicht um den dahinterstehenden Zahlenwert. Jetzt ist es ein uint8_t und 
es funktioniert!

Danke, und gute Nacht ;-)

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.