AVR Rechnet nicht richtig.

Gast #220618
Lesenswert?

Hallo. Folgendes problem:
1
void auswertung (void) {
2
  unsigned char buffer [5] = {0,0,0,0,0};
3
  itoa (count, buffer, 10);  
4
  lcd_gotoxy (0,0);
5
  lcd_puts ("count: ");
6
  lcd_puts (buffer);
7

8
  long time;
9
  time = count * 547;
10
  unsigned char buffer2 [10] = {0,0,0,0,0,0,0,0,0,0};
11
  ltoa (time, buffer2, 10);
12
  lcd_puts ("\ntime: ");
13
  lcd_puts (buffer2);  
14
}

count enthält den wert 190.
wird auch richtig auf dem display angezeigt.
nun müsste logischerweise als 2. wert 105.024 (192 * 547) aufm display
stehen. es steht aber 28.105 auf dem display !?

was mach ich falsch ?
Gast #220619
Lesenswert?

Auf 28105 komme ich nicht, bei mir sind es 39488.
Was auf jedenfall falsch ist, es fehlt long, denn der Compiler rechnet
nur mit int, wenn count auch vom typ int ist:

time = (long)count * 547;
#220620
Lesenswert?

Außerdem solltest du den beiden Puffern noch ein zusätzliches Zeichen
spendieren - Strings in C haben meist noch ein "\0"=0x00 am Ende

du solltest auch anstatt long/int/char vielleicht
unsigned long/unsigned int/unsigned char verwenden.
Angenommen count ist ein char => 190=C0h => oberstes Bit gesetzt
Zahl is negativ, bei der Berechnung kommt was negatives raus.

Gruss
Gast #220622
Lesenswert?

Der Compiler macht leider keine automatische Typwandlung, wenn man zwei
16-Bit Werte multipliziert und sie einer 32-Bit Variablen zuweist.
Bezihungsweise macht er die Typwandlung erst nach der Multiplikation.
Dadurch gehen die oberen 16 Bit der Produkts verloren.
Also schreib entweder:
time = (long)count * 547;
oder
time = count * 547L;

Uwe

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren