Forum: Mikrocontroller und Digitale Elektronik Rechnung mit 16 und 32 bit


von Hannes S. (hannestum)


Lesenswert?

Ich muss 2 Zahlen die in 16bit Reinpassen miteinander multiplizieren. 
Das Ergebnis speichere ich in einer Variablen mit 32 bit. Danach möchte 
ich die Zahl durch einen eigestellten Teiler teilen, und am Display 
ausgeben.

Dafür hab ich folgenden Code geschrieben:
1
uint16_t adtg = 9765;
2
uint16_t adcval_1 = 798;
3
uint32_t temp_32;
4
uint16_t teiler = 10000;
5
uint16_t erg;
6
7
temp_32 = adtg*adcval_1;
8
erg = temp_32/teiler;

Also:
9756*798=7785288
7785288/10000=778.5288

Ich dachte, dass die Nachkommastellen jetz einfach verworfen werden da 
es sich ja un einen Integer handelt (Die nachkommastellen brauch ich 
auch nicht) und einfach 778 ausgegeben wird. Leider funktioniert das 
nicht.
Denke da hab ich wohl irgendeien fehler oder Wickel mit den 32 und 16 
bit!

Wer kann mir sagen wie es richtig geht?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Leider funktioniert das nicht.

Was passiert denn?

von ... .. (docean) Benutzerseite


Lesenswert?

1
temp_32 = (uint32_t)adtg*(uint32_t)adcval_1;

Vlt so..

von Peter (Gast)


Lesenswert?

Schreib mal
temp_32 = (uint32_t)adtg*(uint32_t)adcval_1;

das sollte dann gehen.

von Hannes S. (hannestum)


Lesenswert?

Er schreibt einfach "5" dorthin wo eigentlich 778 stehen sollte.

Falls ich einfach eine uint16 festlege und die ausgebe funktionierts. 
Also ist es nicht der Display und nicht meine Art eine Zahl auf das disp 
zu schreiben. Der Fehler muss bei den Rechnungen irgendwo passieren...

von Hannes S. (hannestum)


Lesenswert?

Sorry, zuspät gelesen.

temp_32 = (uint32_t)adtg*(uint32_t)adcval_1;

funktioniert! Danke!
Was macht das vorangestellte (uint32_t) genau? Konvertiert
das die Zahl vor der Rechnung in 32 bit?

von Willi W. (williwacker)


Lesenswert?

Ja!

Vor der Rechnung und nur für die Rechnung

von Mätte T. (maette)


Lesenswert?

wieso lässt du das temp32 nicht weg und machst gleich:
erg = (uint16_t)(adtg*adcval_1/teiler);
bzw.
erg = (uint16_t)(adtg/teiler*adcval_1);

beim 2. brauchst du ( er intern ) nicht do große Zahlen zum rechnen, 
dafür wirds aber ungenauer, da die Nachkomma verfallen.

Bei 1. und 2. sparst du dir eine 32-Bit Variable.

Das (uint32_t) ist ein Type-Cast der die Nachfolgende Zahl in diesen Typ 
wandelt.

mfg

von Willi W. (williwacker)


Lesenswert?

Sorry, zu schnell auf Absenden gedrückt.

Das Ganze nennt sich "casten" und ist eine Art der Compilersteuerung. Du 
weist den Compiler damit an, die Rechnung in der entsprechenden Form 
auszufürhen.

Das Casten ist in C sehr sehr wichtig. Wenn Du hier schwächelst, 
solltest Du diese Schwäche unbedingt ausmerzen. Gute Tuts gibts in Hülle 
und Fülle.

von Hannes S. (hannestum)


Lesenswert?

Ja, da hab ich wirklich eine Schwäche...
Vielen Dank jedenfalls für die ausführliche Hilfe!

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.