Forum: Compiler & IDEs Probleme mit 32 bit Variablen


von Michael B. (gm8816)


Lesenswert?

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.

von Simon K. (simon) Benutzerseite


Lesenswert?

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

von Jorge (Gast)


Lesenswert?

@Simon

Eigentlich meinst du dann:

if (var1 & (1UL<<28))

von Michael B. (gm8816)


Lesenswert?

Danke das hat funktioniert. Frage mich nur aus interesse wo das UL 
herkommt und wo es definiert wird.

von Jorge (Gast)


Lesenswert?

Das gehört zur Sprachdefinition der jeweiligen Compilerausgabe.

von Simon K. (simon) Benutzerseite


Lesenswert?

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.

von Jorge (Gast)


Lesenswert?

>Operanden als Zieldatentyp der Rechnung angenommen wird.

heisst: "integral promotion"

von Jorge (Gast)


Lesenswert?

Halt falsch!


>Operanden als Zieldatentyp der Rechnung angenommen wird.

heisst: "integral promotion" wenn char -> int
heisst "integral conversion" wenn int16 -> int32

von Jorge (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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

von Rolf Magnus (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

> 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
Noch kein Account? Hier anmelden.