Forum: Compiler & IDEs Schieben einer 1 über mehr als 15 Stellen?


von Jens-Erwin (Gast)


Lesenswert?

Gibt es eine Lösung

uint32_t  Helga;

Helga = (1<<17);  // das geht so oder auch so nicht !!!!!


da ich aber 28 Flags abfragen möchte, könnte ich dieses Schieben über 32 
Stellen gut gebrauchen --

kann jemand helfen???? Danke

von A.K. (Gast)


Lesenswert?

1L << 17

von Jens-Erwin (Gast)


Lesenswert?

Danke - wunderbar - ich bin begeistert ...


Wo bekommt man denn diese Infos her? Gibt es da irgendeine Übersicht, wo 
das alles mal beschrieben ist? Im Tutorial hier habe ich da nichts 
gefunden.


Danke ....

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Stichwort für die weitere Recherche: integer promotion

von yalu (Gast)


Lesenswert?

Das sollte in jedem C-Lehrbuch drin stehen. Eine Operation wird,
unabhängig vom Typ der Ergebnisvariablem, immer in dem Wertebereich
oder der Genauigkeit des "größten" Datentyps der Operanden ausgeführt,
also z. B.

  int   op int    -> int
  long  op int    -> long
  int   op long   -> long
  int   op float  -> float
  float op double -> double

usw.

Wenn die Schiebeoperation also in 32 Bit (long) ausgeführt werden
soll, muss man dafür sorgen, dass mindesetens einer der Operanden long
ist. Dies erreicht man durch eine Typecast (Voranstellen von "(long)")
oder - bei Konstanten wie in diesem Beispiel - durch Anhängen eines
"L".

von Dirk (Gast)


Lesenswert?

>da ich aber 28 Flags abfragen möchte, könnte ich dieses Schieben über 32
>Stellen gut gebrauchen --

Ist es hier vielleicht nicht besser die Flags zuunterteilen wie beim AVR 
und diese in ein Struct zupacken?



von Jens-Erwin (Gast)


Lesenswert?

Ja, habe ich auch immer so gemacht, nur will ich diesmal an einer Stelle 
wissen, ob das gesamte Register (Variable) Null bzw. einen anderen Wert 
hat.

Das habe ich mit struct nicht hinbekommen ..... also z.B.

Control.Flag_1 = 1;
Control.Flag_2 = 0;

...
usw.
...


if (Control==0) ..... klappt irgendwie nicht (logisch oder?)

Außerdem müsste ich trotzdem 28 Stellen schieben können, da ich die 
Flags über eine For-Schleife (i=0;i>28;i++) abfrage. Wie soll ich dass 
mit Strucs machen?

von 123 (Gast)


Lesenswert?

Mit einer Union, die parallel zur Struct noch einen uint32_t beinhaltet. 
Dann klappts auch mit:
if (Control.all == 0)

von Dirk (Gast)


Lesenswert?

Wie waere es dann mit einer Union?

von A.K. (Gast)


Lesenswert?

Mit data overlays, wie solchen unions, sollte man ausgesprochen sparsam 
umgehen. Das ist nicht nur schlechter und eher schlecht lesbarer Stil, 
es gibt dabei auch einige Falltüren.

von A.K. (Gast)


Lesenswert?

PS: Unions wurden erdacht, um den gleichen Platz für verschiedene Dinge 
nutzen zu können. Nicht im den Compiler hinterrücks zu verarschen - denn 
nichts anderes ist die Typkonvertierung per union.

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.