Wireshark mailing list archives
Re: C Bitfield types and alignment
From: Bill Meier <wmeier () newsguy com>
Date: Mon, 05 Dec 2011 16:41:07 -0500
My curiosity was piqued by Guy's comment in SVN #40078: "Bitfields indicate how many bits they are; "guint8 foo:4" is self-contradictory (it's 4 bits, not 8). Furthermore, the C language doesn't support "unsigned char" as a bitfield type;some compilers might accept that, but if you crank up the warning levels, even GCC will warn about that." So: I decided to do some research. What I found:1. The only valid types for a C bitfield (at least for C89) are [unsigned|signed] int (as implied by Guy).
However, supposedly "many" C compilers allow other types. Given that AFAIK we've not had any complaints about the use ofguint8 & etc as a bitfield type, presumably the compilers commonly used to compile Wireshark accept same.
2. I found the following to be interesting (although somewhat academic since with respect to portability (unsigned|signed) int are probably the only valid bitfield types which should be used).
I did some tests using VC9 (on Windows 32bit) and GCC 4.6.1 (on Fedora 32bit).
For these compilers apparently the type of a bitfield (for whatever the compiler accepts as a bitfield type) determines the bitfield alignment and the size of the struct containing that bitfield.
For example: Given
struct radiotap_override {
guint8 field;
guint align:4, size:4;
} aaa;
struct radiotap_override {
guint8 field;
guint8 align:4, size:4;
} bbb;
It turns out that:
sizeof(aaa) = 8
sizeof(bbb) = 2
Apparently the alignment of the start of the bitfield depends upon the
(largest ?) bitfield type;
Also: Given:
struct {
guint16 a:12;
guint16 b:12
} xxx;
struct {
guint a:12;
guint b:12
} yyy;
The size of the two structs is the same, but the alignment of 'b' is
different for each;
As I said: Interesting (in a minor way) :) Bill ___________________________________________________________________________ Sent via: Wireshark-dev mailing list <wireshark-dev () wireshark org> Archives: http://www.wireshark.org/lists/wireshark-dev Unsubscribe: https://wireshark.org/mailman/options/wireshark-dev mailto:wireshark-dev-request () wireshark org?subject=unsubscribe
Current thread:
- Re: C Bitfield types and alignment Bill Meier (Dec 05)
- Re: C Bitfield types and alignment Guy Harris (Dec 05)
- Re: C Bitfield types and alignment Jeff Morriss (Dec 05)
- Re: C Bitfield types and alignment Guy Harris (Dec 05)
- Re: C Bitfield types and alignment Guy Harris (Dec 05)
- Re: C Bitfield types and alignment Guy Harris (Dec 05)
