www.mikrocontroller.net

Forum: Compiler & IDEs Probleme mit 32 bit Variablen


Autor: Michael B. (gm8816)
Datum:

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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal
if (var1 & (1<<28UL))
...

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

Autor: Jorge (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Simon

Eigentlich meinst du dann:

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

Autor: Michael B. (gm8816)
Datum:

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

Autor: Jorge (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das gehört zur Sprachdefinition der jeweiligen Compilerausgabe.

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Autor: Jorge (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Operanden als Zieldatentyp der Rechnung angenommen wird.

heisst: "integral promotion"

Autor: Jorge (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Halt falsch!


>Operanden als Zieldatentyp der Rechnung angenommen wird.

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

Autor: Jorge (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

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.