Forum: Mikrocontroller und Digitale Elektronik uVision C51 Compiler: falsche Kompilierung


von Simon S. (antoras)


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?

von Helmut L. (helmi1)


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

von Simon S. (antoras)


Lesenswert?

Ah, ok. Das hab ich nicht gewusst, dass man das explizit hinschreiben 
muss.

Danke dir, wieder was gelernt.

EDIT:
Reicht es dann wenn ich 60.0 schreibe, oder muss ich in bestimmten 
Fällen 60.0f schreiben?

von (prx) A. K. (prx)


Lesenswert?

60.0 reicht aus.

von Simon S. (antoras)


Lesenswert?

Ok, dann wäre das erledigt.

Nochmal danke für eure Antworten.

von Arc N. (arc)


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.

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.