Problem mit struct (Bit Fields)
-
Hallo.
Erst einmal ein bisschen Quelltext, der für mein Problem relevant ist:
struct SPackageHeader { unsigned short isPackageHeader : 1, payloadSize : 11, channel : 4; };SPackageHeader header; header.isPackageHeader = 1; header.payloadSize = 2048; header.channel = 0;Sofort nachdem dieser Quelltext abgearbeitet ist, ermittele ich per Debugger, dass der Wert von header.payloadSize "0" ist.
Was mache ich falsch? Habe ich etwas falsch verstanden bei Bit Fields?^^Mfg
-
the[V]oid schrieb:
Was mache ich falsch? Habe ich etwas falsch verstanden bei Bit Fields?^^
Nein, aber offensichtlich bei Bit-Berechnungen. 'payloadSize' fasst nur Werte von 0 bis 2047.
-
Ja das war'n peinlicher vergucker ^^ Aber danke, daran lag's... hab' aber ein neues Problem damit:
struct SUniversalHeader { unsigned short headerType : 2, size : 14; unsigned char channel : 8; }; std::cout << sizeof(SUniversalHeader); // gibt 4 ausWoran kann das liegen? Eigentlich müsste die Größe von SUniversalHeader doch 3 Bytes sein... Ein short ist laut sizeof 2 Bytes groß und ein char logischerweise 1 Byte.
mfG
-
nennt sich glaub ich byte-alignment. da setzt dein compiler ein paddingbyte dazu. das macht er damit er immer auf 4 byte speicherausrichtung kommt.
hoffe das das mal so stimmt, sonst berichtigt mich mal bitte.Meep Meep
-
Das glaube ich weniger, denn im ersten Beispiel (ich hab den Code nochmal kopiert) liefert ein sizeof(SPackageHeader) 3 Bytes:
struct SPackageHeader { unsigned short isPackageHeader : 1, payloadSize : 11, channel : 4; };Oder ich habe dich nicht verstanden ^^
EDIT: ich meinte natürlich 2 und nich 3 Bytes

-
re
the[V]oid schrieb:
Das glaube ich weniger, denn im ersten Beispiel (ich hab den Code nochmal kopiert) liefert ein sizeof(SPackageHeader) 3 Bytes
das glaub ich mal fast nicht. ich denke eher das du da 2 bekommst
zumindest faellt mir jetzt kein plausibler grund ein, warum hier sizeof 3 ausgeben sollte.Meep Meep
-
Ja, Tschuldigung, ich meinte natürlich 2 ^^ Aber trotzdem, das würde doch diese Alignment-Sache widerlegen, nich?
-
insofern hast du recht das er scheinbar nicht auf 4 byte sondern auf 2 byte grenzen ausrichtet.
Meep Meep
-
Meep Meep schrieb:
insofern hast du recht das er scheinbar nicht auf 4 byte sondern auf 2 byte grenzen ausrichtet.
Meep Meep
Da hast du sicherlich völlig recht.
Mööp Mööp