AVR Rechnet nicht richtig.

Gast #220618
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
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;
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
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

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.