uVision C51 Compiler: falsche Kompilierung

OP #1483239
Lesenswert?

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?
#1483262
Lesenswert?

>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
#1483320
Lesenswert?

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

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