AutoCast im AVR-GCC vs GCC

Persönliche Seite #5749258
Lesenswert?

Hi,

ich habe aus meinem gesamten AVR-Project ein CMake-Projekt gebaut, dass 
zwei Targets baut. 1x mit TestRoutinen (So eine Art Junit-Tests, jedoch 
NOCH ohne schönes Framework) und 1x das HEX.

Beim betrachten des folgenden Codes:
1
uint16_t correctedTankTemperature(uint16_t t) {//t = 900 +-90
2
    uint32_t m = t * a + b;//a = 1000 +- 200
3
    return divideCommerciallyRound(m, FIXPOINT_MOVEMENT);//1000
4
}

fällt recht schnell auf, dass man den Parameter "tankTemperature" besser 
auf uint32_t setzen sollte, da die 16bit in der Multiplikation bereits 
überlaufen bevor sie in "m" gespeichert werden.

In der Praxis passiert auch genau dies auf dem AVR.
Witzigerweise passiert es jedoch NICHT beim Ausführen des gleichen Codes 
(mit normalen GCC compiliert) auf dem PC.

Daher die Frage, wer/wie/was castet dort automatisch, dass die oben 
sichtbare Methode bereits ohne Überlauf genau das tut was es soll?

Folgefrage:
Wo finde ich weitere Infos die mir genau solche Unterschiede der 
Compiler/Präprozessoren auflisten, damit ich mich in Zukunft etwas 
besser/mehr auf meine Testroutinen verlassen kann?

Grüße David
#5749343
Lesenswert?

Die Regeln sind immer die die selben, zu finden unter „integral 
Promotion“ im C-Stabdard. Eine der Regeln besagt vereinfacht, daß 
Berechnungen immer mindestens mit dem Datentyp int durchgeführt werden.

Der Unterschied ist, daß ein int auf dem AVR nur 16bit breit ist, auf 
dem PC aber 32. Damit erklären sich unterschiedlichen Wertebereiche.

Oliver

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