Forum: Mikrocontroller und Digitale Elektronik 16 oder 32 Bit-Variable


von P. F. (pfuhsy)


Lesenswert?

Hallo zusmmanen,

ich hab folgenden Code:
1
WRT0 = Ubat_errechnen(232, 3300);
2
....
3
4
int Ubat_errechnen (int wert, int ref) 
5
{
6
  uint16_t result = 0;      //max. Wert 3300 (Wert 256 x 3300 Ref. / 256)
7
  result = wert * ref / 256;  //erst Multiplikation um Rundungsfehler zu minimieren
8
9
  return result;
10
}

In der Simulation im AVR-Studio erwarte ich jetzt eigentlich als 
Rückgabewert "2990", doch in der Varible result steht "65455". Warum ?

Könnte es sein, dass der µC (Atmega8) mit den Zwischenergebnis "765.600" 
(bevor er mit 256 diviert) ist klar kommt, da dieser größer als 16 Bits 
ist ? Auch wenn ich die Variable "result" mit uint32_t deklariere, kommt 
nur Mist raus. Was mache ich falsch ?

von Peter II (Gast)


Lesenswert?

Peter F. schrieb:
> Was mache ich falsch ?

du musst auch mit 32bit rechnen
1
 return ((uint32_t)wert) * ref  / 256

von Thomas W. (wagneth)


Lesenswert?

Grundsätzlich rechnet unser Compiler mit dem grössten Typ auf der 
rechten Seite.

Du hast recht !
Bei der Berechnung fällt das Zwischenergebnis einem 16bit überlauf zum 
opfer.

Peter umgeht das Problem mit einem Cast.
Möglich wäre auch eine Variable auf der rechten Seite als uint32_t zu 
definieren.

von P. F. (pfuhsy)


Lesenswert?

Danke für die schnelle HIlfe. Ich werde es mal testen.

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.