uint32_t - stolperfalle ?

Gast #238154
Lesenswert?
• ▲
▼
... um die ingrid zu machen -

(...)                    Distance = (uint32_t)(3700 + 3800 * (NextTrak -
CurrentTrak - 1));
              ltoa(Distance,buffer,10);
                    lcd_puts(buffer);
(...)

ich erhalte die anzeige eines negativen werte sobald sich Distance
größer als 32768 berechnet  .... erwartet hätte ich 32769 ... und höher


bin etwas ratlos ... weil selbst Casten scheinbar nicht hilft.

alle Variablen sind uint32_t bzw. unsigned long deklariert.

ich arbeite mit der winavr Ausgabe vom Februar diesen Jahres.

Grüße,

Stefan
Gast #238155
Lesenswert?
• ▲
▼
hrmpppfff ...

Distance = (uint32_t) 3700 + (uint32_t) 3800 * (NextTrak - CurrentTrak
- (uint32_t) 1);

so gehts jetzt - nur - worin liegt denn für den Compiler der echte
unterschied zu:

Distance = (uint32_t)(3700 + 3800 * (NextTrak -
CurrentTrak - 1));

Warum convertiert er hier die Constanten nicht passend ?

Grüße,

Stefan
Moderator Persönliche Seite #238157
Lesenswert?
• ▲
▼
> so gehts jetzt - nur - worin liegt denn für den Compiler der echte
> unterschied zu ... Warum convertiert er hier die Constanten nicht
> passend?

Weil er nicht muss.  Die argument promotion in Ausdrücken erfolgt
immer paarweise, d.h. wenn eine der beiden Seiten eines binären
Operators einen ,,größeren'' Typ hat als die andere Seite, dann wird
die andere Seite zuvor auf diesen Typ erweitert.  Konstanten, die groß
genug sind, um nicht mehr in `int' zu passen, werden dabei
automatisch
zuerst als `unsigned int' genommen, wenn das nicht mehr genügt als
`long' usw.  Deine Konstanten passen aber alle bequem in ein `int'.
Würdest du nur eine davon mit einem UL-Suffix versehen, wäre sie aber
unsigned long, und damit müsste der Rest des Ausdrucks vor der
Rechnung ebenfalls dahin konvertiert werden.  Die (unit32_t) typecasts
tun natürlich dasselbe.
Gast #238161
Lesenswert?
• ▲
▼
> Weil du rein gar nichts von obiger Diskussion verstanden hast.

Kannst du so nicht sagen denn zugegebenermaßen habe ich die Diskussion
nur ansatzweise gelesen. Daher vergebt mir bitte meinen Beitrag...



P.S.: Warum unit32_t statt "unsigned long" habe ich nie verstanden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren