Hallo, Ich habe eine 32 bit Variable uint32_t var1. Jetzt möchte ich mit if(var1 & (1<<28)) testen, ob das 28. Bit gesetzt ist. leider wird die if Abfrage immer übersprungen. Bei uint8_t oder uint16_t funktioniert das hingegen.
Probier mal
1 | if (var1 & (1<<28UL)) |
2 | ...
|
Hintergrund: Eine 1 um 28 (Binär-)Stellen nach links verschoben passt nicht in einen Integer (16Bit beim AVR). Und Jede Zahlenkonstante ist erstmal ein Integer für den Compiler. Mit UL hinter der Konstante sagst du dem Compiler, dass es sich um einen unsigned-long typ handelt (32Bit beim AVR).
Danke das hat funktioniert. Frage mich nur aus interesse wo das UL herkommt und wo es definiert wird.
Jorge wrote: > @Simon > > Eigentlich meinst du dann: > > if (var1 & (1UL<<28)) Eigentlich müsste beides funktionieren, da bei der "<<" Operation (wie eigentlich bei (fast?) allen) der höchste verwendete Datentyp der Operanden als Zieldatentyp der Rechnung angenommen wird.
>Operanden als Zieldatentyp der Rechnung angenommen wird.
heisst: "integral promotion"
Halt falsch!
>Operanden als Zieldatentyp der Rechnung angenommen wird.
heisst: "integral promotion" wenn char -> int
heisst "integral conversion" wenn int16 -> int32
wieder falsch! So wars gemeint: unsigned char -> unsigned int16 (promotion) char -> unsigned int16 (conversion) Innerhalb der Signaturen bei C++ wird's für den Menschen richtig kompliziert. Aber gut, dass es mal angesprochen wurde...
@Jorge: Wenn schon, dann auch richtig schreiben. Das hat nix mit "Integralen" oder so zu tun, sondern mit ganzzahligen Werten (engl. integer values) und es heißt dementsprechend integer promotion...
> Wenn schon, dann auch richtig schreiben. Das hat nix mit "Integralen" > oder so zu tun, sondern mit ganzzahligen Werten (engl. integer values) ... oder "integral values" ... > und es heißt dementsprechend integer promotion... In C ja. In C++ heißt es "integral promotion".
Rolf Magnus wrote:
> In C ja. In C++ heißt es "integral promotion".
Aha, ist das tatsächlich so? Hmmm, man lernt nie aus... Frohe
Weihnachten noch.
> Aha, ist das tatsächlich so? Ja. In C++ unterscheidet man zwischen der Menge der "integer values" und der der "integral values". Letzere beinhaltet neben ersteren noch ein paar weitere Typen wie z.B. bool. Da die "promotions" auch für diese gelten, heißen sie dort "integral promotions". > Frohe Weihnachten noch. Das wünsche ich dir auch.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.