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

标签 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)

以防万一,我在 Windows 7 x64 上运行 MinGW GCC 4.5.0,但老实说,结果对我来说很奇怪,我认为编译器和操作系统在这里并不重要。 :\

最佳答案

您不能让字段以字节未对齐的地址开始。 你期待:

6 bits + 9 bits -> 15 bits -> 2 bytes

但是你得到的是:

6 bits -> 1 byte
9 bits -> 2 bytes
total ->  3 bytes

数据存储为:

| 1 byte | 2 byte |3 byte | 
 aaaaaaXX bbbbbbbb bXXXXX  

当你期待:

| 1 byte | 2 byte |
 aaaaaabb bbbbbbbX  

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

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

struct MyStruct
{
    unsigned char a : 6;
    union
    {
        struct
        {
            unsigned int b : 9;
        } c:9;
    } d:9;
};

因为 C 不允许您指定整个结构的位大小。

关于c - C 中的位域,其结构包含结构的并集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5055142/

相关文章:

c - C 中的指针内部结构错误 "' struct.pointer' '.' 意外“

c - 如何在 C 中打印事件窗口的标题 - WinAPI

c - 分配连续内存

c++ - 打印结构的结构数组会导致意外的执行错误?

python - 在Python中将字节转换为长整型

struct - println 中的可变和不可变引用

c++ - 如何初始化指向 nullptr 的指针 union ?

c++ - 如何为 extern "C"设置 C 版本?

c++ - 联盟的内存映射

ios - Swift 子类复杂子类型