32Bit Variable Abfragen geht nur bis BIT 15, was läuft hier falsch?!

Gast #4775559
Lesenswert?

Hallo,

ich brauche (leider) einmal im Leben eine 32-bit Variable auf meinem AVR 
ATMega168 und da klappt es nicht.
1
uint32_t test=0;
2

3
...
4

5
main()
6

7
test |= (1<<17);
8

9
...
10

11

12
while(1)
13
{
14
   if (test & (1<<17)) usart_puts("klappt\n");
15
}


Das klappt genau bis Bit 15, danach ist Feierabend.
Wo liegt mein Fehler?!
#4775565
Lesenswert?

Eine 1 ist ohne weitere Angaben ein int und damit auf dem AVR 16 bit 
lang. Bei 17 mal linksshiften ist sie also links herausgefallen und das 
Ergebnis ist 0. Damit das nicht passiert, muss der Compiler wissen, dass 
er die 1 nicht als int, sondern gleich als einen 32bit-Typ behandeln 
soll:
1
(1UL << 17)

PS: Zu langsam...
Gast #4775571
Lesenswert?

Tom K. schrieb:
> Eine 1 ist ohne weitere Angaben ein int und damit auf dem AVR 16 bit
> lang. Bei 17 mal linksshiften ist sie also links herausgefallen und das
> Ergebnis ist 0. Damit das nicht passiert, muss der Compiler wissen, dass
> er die 1 nicht als int, sondern gleich als einen 32bit-Typ behandeln
> soll:
>
1
> (1UL << 17)
2
>
>
> PS: Zu langsam...

Alles gute Einwände, die ich aber getestet hatte.
Ich hatte sogar ((uint32_t)1<<17) genommen. Das klappt alles nicht.


EDIT: Ich habe es jetzt doch. Ich dussel habe nur in der Abfrage den 
32-Bit Cast gemacht, aber nicht beim Setzen des Bits. Jetzt geht es! 
Danke!

Bei sowas wäre das klug, wenn der Compiler das bemerken würde. Tricky 
Falle!
Gast #4775775
Lesenswert?

W.S. schrieb:
> Yalu X. schrieb:
>> Und dann meckern, wenn...
>
> Jaha, ist das nicht die große Freiheit, von der alle "echten"
> C-Programmierer täglich träumen?
>
> W.S.


Ja da gebe ich dir sogar Recht! Ich gehöre genau dazu und trotzdem hat 
es mich voll erwischt :o, dabei habe ich das sogar schon gecastet, aber 
nicht an allen Stellen. Aber gut, jetzt bin ich achtsamer :D
Gast #4775897
Lesenswert?

W.S. schrieb:
> Jaha, ist das nicht die große Freiheit, von der alle "echten"
> C-Programmierer täglich träumen?

Ehrlich gesagt: Nein. Das machen nur Anfänger, solange sie Aufbau und 
Struktur der Sprache nicht verstehen und programmieren mit probieren 
verwechseln.

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