Hallo zusammen, ich möchte eine Variable berechnen bei dem ich weiss dass das Schlussresultat in 16bit liegt, aber Zwischenresultate sind viel zu gross. Darf man sowas? Ein Beispiel: uint8_t zahl1; uint8_t zahl2; uint16_t test; zahl1 = 50; zahl2 = 100; test = ((2000 * zahl2) / (1000 * zahl1)); Dieses Beispiel macht natürlich keinen Sinn. Würde das der Mikrocontroller richtig rechnen? Danke Gruss Dominik
Dominik W. schrieb: > Hallo zusammen, > > ich möchte eine Variable berechnen bei dem ich weiss dass das > Schlussresultat in 16bit liegt, aber Zwischenresultate sind viel zu > gross. Darf man sowas? > Dürfen tust du. Kein Mensch hindert dich daran. Und ein Compiler erst recht nicht. Nur kommt hinten Unsinn raus.
Alles klar, werde ich es am besten als 32bit definieren. Hätte ja sein können das der Compiler es richtig interpretiert ;) Danke Gruss Dominik
Dafür gibt es Type-Cast. Also beim Berechnen erstmal in (uint_32_t) umwandlen, danach das Ergebnis mit einem Cast auf (uint16_t) zurechtstutzen. Alternativ kann man die Berechnung eventuell in 2 Schritte zerlegen, bei der kein Überlauf stattfindet oder bei der Division vorher was kürzen. Im Zweifelsfall lieber auf 32 Bit gehen, die Laufzeit wird nicht viel größer. unn tschuess Bernhard
Wenn Zwischenergebnisse groß werden können, muss man ihnen einen Datentyp zuweisen, der alle Bits fassen kann. Platz sparen geht nur, wenn man einen Rechenweg findet, der die Zwischenergebnisse nicht zu groß werden lässt.
Danke für die super Antworten und Tipps :) Allen noch einen schönen Abend
In diesem Fall sollte ein
1 | test = ((2000UL * zahl2) / (1000UL * zahl1)); |
reichen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.