嗯...为什么我打印的时候会这样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
编辑:
根据以下评论进行澄清:
联合(和包含的结构)必须是字节对齐的。内容只有 9 位并不重要,union/struct 本身就是完整的 16 位。请注意,您不能执行以下操作:
struct MyStruct
{
unsigned char a : 6;
union
{
struct
{
unsigned int b : 9;
} c:9;
} d:9;
};
因为 C 不允许您指定整个结构的位大小。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)