C中的位域,结构包含结构的并集

Meh*_*dad 3 c struct unions bit-fields

嗯...为什么我打印sizeof(struct MyStruct)时输出3(而不是2)代码呢?

#pragma pack(push, 1)
    struct MyStruct
    {
        unsigned char a : 6;
        union
        {
            struct
            {
                unsigned int b : 9;
            };
        };
    };
#pragma pack(pop)
Run Code Online (Sandbox Code Playgroud)

如果它很重要,我在Windows 7 x64上运行MinGW GCC 4.5.0,但老实说,结果对我来说很奇怪,我不认为编译器和操作系统在这里太重要了.:\

nss*_*nss 13

您不能让字段从非字节对齐的地址开始.你期待的是:

6 bits + 9 bits -> 15 bits -> 2 bytes
Run Code Online (Sandbox Code Playgroud)

但你得到的是:

6 bits -> 1 byte
9 bits -> 2 bytes
total ->  3 bytes
Run Code Online (Sandbox Code Playgroud)

数据存储为:

| 1 byte | 2 byte |3 byte | 
 aaaaaaXX bbbbbbbb bXXXXX  
Run Code Online (Sandbox Code Playgroud)

当你期待的时候:

| 1 byte | 2 byte |
 aaaaaabb bbbbbbbX  
Run Code Online (Sandbox Code Playgroud)

编辑:根据以下评论澄清:

union(和包含结构)必须是字节对齐的.内容只有9位并不重要,union/struct本身是一个完整的16位.请注意,您无法执行以下操作:

struct MyStruct
{
    unsigned char a : 6;
    union
    {
        struct
        {
            unsigned int b : 9;
        } c:9;
    } d:9;
};
Run Code Online (Sandbox Code Playgroud)

由于C不允许您指定整个结构的位大小.