Forum: Compiler & IDEs U, L, UL, etc an Konstanten sinnvoll?


von Johannes G. (joe19)


Lesenswert?

Hallo,

ich habe schon oft gesehen, dass an Konstanten ein U, UL, L etc 
angehängt wird. Der Sinn ist mir schon klar, also dass es für unsigned, 
unsigned long, long, etc steht.

Nur macht es Sinn das an Konstanten anzuhängen? Sollte das nicht der 
Compiler automatisch erkennen?

Das ganze hab ich auch schon mehrmals in Rechnungen gesehn...
also z.B. "uint32_t test = 400L * var";
Was würde passieren wenn ich das "L" weglasse?

Vielen Dank schonmal ;)

von der mechatroniker (Gast)


Lesenswert?

Auf Systemen mit 16-bittigen Ints kommt bei var = 400 mit L 160000 raus, 
ohne L 28928.

Auf Systemen mit 32-bittigen Ints ists in diesem Beispiel wurscht.

von Andreas B. (andreas_b77)


Lesenswert?

Johannes G. schrieb:
> Das ganze hab ich auch schon mehrmals in Rechnungen gesehn...
> also z.B. "uint32_t test = 400L * var";
> Was würde passieren wenn ich das "L" weglasse?

Wenn es sich um ein System mit 16 Bit ints handelt (etwa avr-gcc) und 
var nicht größer als 16 Bit ist, dann wird die Rechnung per default in 
16 Bit ausgeführt, dann auf 32 Bit Unsigned gewandelt und an test 
zugewiesen.

Mit 400L wird die Rechnung als long (vermutlich 32 Bit in dem Beispiel) 
ausgeführt. Ein gewaltiger Unterschied, falls die Rechnung in 16 Bit 
überlaufen könnte.

von Sven P. (Gast)


Lesenswert?

Wenn du dir nicht sicher bist, wohin die Reise geht, könntest du z.B. 
stdint.h benutzen. Dort gibts dann Makros für Konstanten, die im 
Zweifelsfall die Suffixe anbringen.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Andreas B. schrieb:
> Johannes G. schrieb:
>> Das ganze hab ich auch schon mehrmals in Rechnungen gesehn...
>> also z.B. "uint32_t test = 400L * var";
>> Was würde passieren wenn ich das "L" weglasse?
>
> Wenn es sich um ein System mit 16 Bit ints handelt (etwa avr-gcc) und
> var nicht größer als 16 Bit ist, dann wird die Rechnung per default in
> 16 Bit ausgeführt, dann auf 32 Bit Unsigned gewandelt und an test
> zugewiesen.

Nur wenn var eine 16- oder 8-Bit Variable ist.
Ist var >= 32 Bit, dann wird die Rechnung natürlich in entsprechender 
Weite durchgeführt.

von Rolf Magnus (Gast)


Lesenswert?

Johann L. schrieb:
>> Wenn es sich um ein System mit 16 Bit ints handelt (etwa avr-gcc) und
>> var nicht größer als 16 Bit ist,
>
> Nur wenn var eine 16- oder 8-Bit Variable ist.

16- und 8-Bit-Variablen gehören zu denen, die nicht größer als 16 Bit 
sind.

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.