ich bastel akut an der Ansteuerung einer SD-Karte, bin dabei im AVR-GCC
über einen Effekt gestolpert der mein "Schulwissen" in Frage stellt. Und
zwar berechne ich aus drei Variablen eine Blocknummer, letztere soll 32
Bit breit sein. Zuerst hab ich das so gemacht:
1 | uint8_t hstdsk; // Wertebereich 0..15
|
2 | uint16_t hsttrk; // Wertebereich 0..511
|
3 | uint8_t hstsec; // Wertebereich 0..31
|
4 | uint32_t blockno; // Blocknummer für SD-Karte, 0..262143
|
5 |
|
6 | ...
|
7 |
|
8 | blkno = hstsec + (hsttrk << 5) + (hstdsk << 14);
|
Musste feststellen, dass blkno dann immer ein 16-Bit breites Ergebnis
bekommt. Als nächstes hab ich ein explizites cast in die Zuweisung
geschrieben, also so:
1 | blkno = (uint32_t) (hstsec + (hsttrk << 5) + (hstdsk << 14));
|
Das hat ebenfalls nicht geholfen. Erst nachdem ich alle beteiligten
Variablen als uint32_t definiert hatte kam das gewünschte Ergebnis
heraus. Verhält sich das AVR-GCC hier anders als Standard-C oder hab ich
einen Denkfehler?