我不知道为什么,但位字段分配没有按预期工作。可能只是一件愚蠢的事情,但我一直无法找到问题所在。
非常欢迎任何帮助。
typedef struct a {
unsigned char a1 :1;
unsigned char a2 :3;
unsigned char a3 :2;
unsigned char a4 :2;
} __attribute__((packed)) mystruct;
int main() {
mystruct d;
d.a1 = 0;
d.a2 = 2;
d.a3 = 1;
d.a4 = 2;
unsigned char *val = (unsigned char*) &d;
printf("%02X \n", *val);
printf("%02X \n", sizeof(hola));
exit(0);
}
返回的输出:
94
01
预期输出:
26
01
几乎所有关于位域的内容都是由实现定义的。特别是一个单元中的位顺序。
(C99,6.7.2.1p10)“单元内位字段的分配顺序(高位到低位或低位到高位)是实现定义的。”
在您的实现中,这些位首先存储在一个单位 lsb(最低有效位)中,而不是您所期望的首先存储在 msb(最高有效位)中。
你拥有的是:
[a1.0] [a2.0] [a2.1] [a2.2] [a2.0] [a3.1] [a4.0] [a4.1]
0 0 1 0 1 0 0 1
bit 0 - bit 7
lsb - msb
这是0x94
如果您认为最左边的位是最低有效位。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)