Berechnungen, die sowohl vorzeichenlose als auch vorzeichenbehaftete
Operanden enthalten, sind immer mit etwas Vorsicht zu genießen.
1 | #define TL 30 // Variante 1
|
TL ist vom Typ int bzw. int32_t, also vorzeichenbehaftet.
1 | #define TL (CALIBRATION0 & 0XFF) //Variante 2
|
Hier ist der hinter TL steckende Ausdruck vom Typ uint32_t, also
vorzeichenlos. Damit wird die Berechnung von float_Zaehler in uint32_t
ausgeführt. Ein negatives Ergebnis wird deswegen als der im
Zweierkomplement entsprechende positive Wert interpretiert und ist
damit um 2³² zu groß, was zu einem unsinnigen Gesamtergebnis führt.
Hier ist TL wieder vorzeichenbehaftet, weswegen das obige Problem
nicht entsteht.
1 | TL = (CALIBRATION0 & 0XFF);
|
(CALIBRATION0 & 0XFF) ist zwar vorzeichenlos, wird aber bei der
Zuweisung an TL in int32_t konvertiert.