uVision C51 Compiler: falsche Kompilierung

OP #1483239
Hallo,

ich hab ein Problem mit dem C51-Compiler aus uVision. Folgendes Programm
1
void main()
2
{
3
  int i = (int) (60 / 61 * 1000);
4
}
kompiliert der zu diesem ASM-Code:
1
CLR A       ;Akku löschen
2
MOV 0x08,A  ;int-Variable mit leerem Akku befüllen.
3
MOV 0x09,A
Als Ergebnis müsste eigentlich 983 rauskommen. Selbst mit einer 
printf-Anweisung optimiert mir der Compiler das alles weg.

Kann mir jemand sagen warum er das macht?
>Als Ergebnis müsste eigentlich 983 rauskommen.

Falsch ! da kommt 0 raus wie der Compiler schon ausgerechnet hat.

60 / 61 = 0   weil das eine Integerrechnung ist

0 * 1000 bleibt 0.

und deshalb hat dein Compiler schon richtig ausgerechnet das das 0 ist.

du musstes vielmehr schreiben:

60.0 / 61.0

damit zwingst du den Compiler zur Flieskommarechnung

Gruss Helmi
Man kann sich auch die Fließkomma-Rechnerei sparen, wenn man passend 
castet bzw. umstellt:
int16_t res = (int16_t)((int32_t)60 * 1000 / 61);
lässt man den int32_t-Cast weg, passt das Ergebnis auch nicht (falls int 
nur 16-Bit hat), allerdings sollte der Compiler dann zumindest eine 
Warnung ala Integer-Overflow ausgeben.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 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.