Forum: Mikrocontroller und Digitale Elektronik Berechnungen in 16bit Variablen


von Dominik W. (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Dominik W. (Gast)


Lesenswert?

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

von Bernhard S. (b_spitzer)


Lesenswert?

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

von Bernd (Gast)


Lesenswert?

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.

von Dominik W. (Gast)


Lesenswert?

Danke für die super Antworten und Tipps :)

Allen noch einen schönen Abend

von DirkB (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.