www.mikrocontroller.net

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


Autor: Jens-Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1L << 17

Autor: Jens-Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ....

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stichwort für die weitere Recherche: integer promotion

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?



Autor: Jens-Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: 123 (Gast)
Datum:

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

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie waere es dann mit einer Union?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.