Forum: Mikrocontroller und Digitale Elektronik GCC Bug beim berechnen?


von Daniel (Gast)


Lesenswert?

Ich habe folgenden Fehler

Wenn ich folgende Formel berechne:
1
...
2
unsigned int daten_sektor;
3
unsigned int aktuellercluster;
4
unsigned long datensektor;
5
...
6
7
stream->datensektor = (vbr.daten_sektor + ((stream->aktuellercluster - 2) * 32));

Kommt stream->datensektor nie über 65536.

Wenn ich aber die Formel teile:
1
...
2
stream->datensektor = stream->aktuellercluster - 2;
3
stream->datensektor *= 32;
4
stream->datensektor += vbr.daten_sektor;
5
...

Dann wird stream->datensektor korrekt berechnet.

Dies hat mich einiges an spucke gekostet bevor ich diesen fehler 
gefunden habe

WinAVR-20090313
gcc -Os

Ist dies ein Bug?

von (prx) A. K. (prx)


Lesenswert?

Kein Bug, sondern der übliche Programmierfehler. Der Typ auf der linken 
Seite von "=" hat keinen Einfluss auf die Rechnung rechts. Somit wird
    (vbr.daten_sektor + ((stream->aktuellercluster - 2) * 32))
in 16 Bits gerechnet. Korrekt:
    (vbr.daten_sektor
       + ((unsigned long)(stream->aktuellercluster - 2) * 32))

von Sven P. (Gast)


Lesenswert?

A. K. schrieb:
> Kein Bug, sondern der übliche Programmierfehler. Der Typ auf der linken
> Seite von "=" hat keinen Einfluss auf die Rechnung rechts. Somit wird
>     (vbr.daten_sektor + ((stream->aktuellercluster - 2) * 32))
> in 16 Bits gerechnet. Korrekt:

Ich bin grad unsicher: Sollte nicht alles unter der Größe eines 'int' 
vor der Verrechnung auf 'int' aufgeblasen werden?

von (prx) A. K. (prx)


Lesenswert?

Doch. Aber "unsigned int" ist nicht kleiner als "int".

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.