16 oder 32 Bit-Variable

OP #3957971
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 ?
#3957992
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.