Forum: Mikrocontroller und Digitale Elektronik AVR Rechnet nicht richtig.


von Johannes (Gast)


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 ?

von Benedikt (Gast)


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;

von Thomas S. (tstuetz)


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

von Thomas S. (tstuetz)


Lesenswert?

Sorry, kleiner Lapsus: 190 ist BEh und nicht C0h (192) das besagte 7.Bit
ist aber auch da gesetzt.

von Uwe Nagel (Gast)


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

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.