Forum: Mikrocontroller und Digitale Elektronik 32Bit Variable Abfragen geht nur bis BIT 15, was läuft hier falsch?!


von MOBA 2. (Gast)


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?!

von Flip (Gast)


Lesenswert?

konstante in der zuweisung muss auh groß genug seil. z.b. UL

von der mechatroniker (Gast)


Lesenswert?

Pobiers mal mit 1L<<17

von Tom K. (ez81)


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

von MOBA 2. (Gast)


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!

von (prx) A. K. (prx)


Lesenswert?

Marius D. schrieb:
> Bei sowas wäre das klug, wenn der Compiler das bemerken würde.

Sollte GCC eigentlich auch:
warning: left shift count >= width of type [enabled by default]

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Marius D. schrieb:
> Bei sowas wäre das klug, wenn der Compiler das bemerken würde.

Tut er auch:
1
test.c:8: warning: left shift count >= width of type

von MOBA 2. (Gast)


Lesenswert?

Peter D. schrieb:
> Marius D. schrieb:
>> Bei sowas wäre das klug, wenn der Compiler das bemerken würde.
>
> Tut er auch:
>
1
> test.c:8: warning: left shift count >= width of type
2
>


Ohh....Ja... Warnings habe ich abgeschaltet :D

von Yalu X. (yalu) (Moderator)


Lesenswert?

Marius D. schrieb:
> Ohh....Ja... Warnings habe ich abgeschaltet :D

Und dann meckern, wenn der Compiler nicht meckert ... :)

von W.S. (Gast)


Lesenswert?

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.

von MOBA 2. (Gast)


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

von A. S. (Gast)


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.

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.