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

Gast #4775559
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?!
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 10 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.