-
-
Erfahrener Benutzer
Fleißiges Mitglied
Den Überlauf Fehler behebt man folgendermaßen:
Aufgabe: x=(ADC/1024)*200
Lösung mit Fließkomma: x=(double) (ADC/1024)*200
Lösung ohne Fließkomma: x=(uint32_t) ADC*200/1024
Immer, wenn Du Ausdrücke in Klammer schreibst, besteht die Gefahr, dass der Compiler für das Zwischenergebnis eine zu kleine Variable verwendet. ADC ist 16bit, und 1024 passen auch in 16bit rein. Also verwendet der Compiler für den Ausdruck (ADC/1024) eine 16bit Integer Variable. Da das Ergebnis immer <1 ist, hast DU dann als Ergebnis eine Null.
Für den Ausdruck (ADC*200) verwendet der Compiler aus dem gleichen Grund eine 16bit Integer Variable. Der Wert kann bis zu 204.600 betragen, was in 16bit nicht mehr rein passt. Da werden dann die überschüssigen Bits einfach links abgeschnitten.
Durch die Angabe (double) bzw. (uint32_t) bestimmst Du, welchen Typ die Variable für das Zwischenergebnis haben soll.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen