Forum: PC-Programmierung Konstanten Prefixe "U"und "UL"


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Thorsten R. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich schreibe grad für den AVR328 ein Programm und trotz guter C 
Kenntnisse bin ich etwas verwirrt, was die Fähigkeit des GCC angeht zu 
erkennen, wie lang Zahlen sind.

Der AVR ist 8 Bit, ich benutze uint8_t bis uint32_t Formate. Millies ist 
wohl ein uint32_t.

Für einen Timeout möchte ich so verfahren:

if (millis() > (to_timer + GSM_ONLINE_PERIOD)) {.....}

GSM_ONLINE_PERIOD sollen 90s, also 90.000 ms sein.
#define GSM_ONLINE_PERIOD (90*1000)

Muss dann hinter das 1000 dieses UL hinter? Steht wohl für unsigned 
long.
Ist beim AVR dann auch 32 Bit.

Also

#define GSM_ONLINE_PERIOD (90*1000UL)

Oder ist der GCC ist der Lage selbst zu erkennen in welches Format die 
defines passen?

Oder wäre es besser zu casten mit (uint32_t)(GSM_ONLINE_PERIOD )

Gruss,
Thorsten

von S. R. (svenska)


Bewertung
1 lesenswert
nicht lesenswert
Thorsten R. schrieb:
> Oder ist der GCC ist der Lage selbst zu erkennen
> in welches Format die defines passen?

Die #defines sind pure Textersetzung vom Präprozessor, da gibt es keine 
Zahlen und Wertebereiche. Und für den Compiler ist alles "int" (was auf 
dem AVR nur 16 Bit breit ist), d.h. wann immer du aus "int" rausläufst, 
musst du einen größeren Datentyp erzwingen.

(long)(großer_ausdruck) läuft trotzdem über, weil (großer_ausdruck) 
überläuft. Da hilft dann auch eine nachträgliche Erweiterung nicht mehr.

Deswegen arbeitet man mit 1000UL.

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
1 lesenswert
nicht lesenswert
Übrigens sind das keine Prefixe, sondern Suffixe.

Ein Prefix kommt davor, ein Suffix danach.

von Thorsten R. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für Eure Antworten. Es wird klarer ;-)

Gruss,
Thorsten

von Rolf M. (rmagnus)


Bewertung
2 lesenswert
nicht lesenswert
Thorsten R. schrieb:
> #define GSM_ONLINE_PERIOD (90*1000UL)
>
> Oder ist der GCC ist der Lage selbst zu erkennen in welches Format die
> defines passen?

In C gilt: Der Datentyp, mit dem eine Rechenoperation durchgeführt wird, 
hängt immer ausschließlich vom Typ der Operanden ab und nicht davon, 
wie groß das Ergebnis wäre oder wo es gespeichert wird. Bei der 
Multiplikation werden beide Operanden mindestens auf int erweitert, oder 
wenn einer größer ist, auf den größten Typ. Das ist auch unabhängig 
davon, ob die Berechnung zur Compilezeit oder zur Laufzeit durchgeführt 
wird.
Und dann gilt für die Konstanten: Alles, was in einen int passt, ist vom 
Typ int, wenn man nicht explizit was anderes vorgibt. Da sowohl 90, als 
auch 1000 vom Typ int sind, wird die Berechnung auch mit int 
durchgeführt. Da das Ergebnis auf einem AVR nicht in int passt, kommt 
dann Blödsinn raus. Der Suffix UL oben sagt, dass die 1000 vom Typ 
unsigned long sein soll. Das führt dazu, dass die 90 ebenfalls nach 
unsigned long vergrößert wird und die Berechnung dann damit ausgeführt 
wird. Das Ergebnis ist dann richtig, weil es in unsigned long (32 Bit) 
passt.

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]
  • [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.