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 | |
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).
Gast
#735418
@Simon Eigentlich meinst du dann: if (var1 & (1UL<<28))
Danke das hat funktioniert. Frage mich nur aus interesse wo das UL herkommt und wo es definiert wird.
Gast
#735425
Das gehört zur Sprachdefinition der jeweiligen Compilerausgabe.
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.
Gast
#735435
>Operanden als Zieldatentyp der Rechnung angenommen wird.
heisst: "integral promotion"
Gast
#735436
Halt falsch!
>Operanden als Zieldatentyp der Rechnung angenommen wird.
heisst: "integral promotion" wenn char -> int
heisst "integral conversion" wenn int16 -> int32
Gast
#735439
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...
Gast
#735609
> 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.
Gast
#735701
> 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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.