Der Martin: C - Pointer-Arithmetik Problem

Beitrag lesen

Moin!

Ja, ich weiß: In structs kann man Felder definieren, die kleiner als ein Byte sind und nicht einmal an Bytegrenzen beginnen bzw. enden müssen:
typedef struct
{ int status:3;
   int command:3;
   int count:12;
} CTRLWORD;

Das ist mir vollkommen neu. Wie setzt der Compiler das denn um? Gehört es zum ANSI-C-Standard?

Soweit ich weiß, ja. Aber ich bin mir nicht sicher. Die Microsoft- und Borland-Compiler kennen das jedenfalls.
Wie er das umsetzt? Na, für die Speicherreservierung ist das ja kein Problem. Der Speicherbedarf wird dabei einfach auf den nächsten möglichen Bytewert (oder WORD, oder DWORD, je nach Architektur) aufgerundet. Und der Zugriff auf diese Felder wird im Quellcode genauso formuliert wie bei einer herkommlichen Struktur, nur dass z.B. command nur einen Wertebereich von 0..7 (oder -4..+3) hat.
Formuliere ich einen lesenden Zugriff auf ctrlword.command, dann codiert der Compiler einen BYTE/WORD/DWORD-Zugriff auf die gesamte Struktur mit einem anschließenden >>3 und &7.

12+3+3 sind doch 18.

Hmm, jetzt wo du das so sagst... ;-)
Stimmt natürlich, dann ist das Konstrukt, das ich als Beispiel konstruiert habe, natürlich 18bit lang, und der Compiler wird es vermutlich auf 32bit aufrunden.

Schönen Tag noch,

Martin

--
Du kannst dem Leben nicht mehr Tage geben.
Aber dem Tag mehr Leben.