GCC Bug beim berechnen?

Gast #1349274
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?
#1349285
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))
Gast #1349306
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?

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