位字段结构赋值意外行为

2023-11-30

我不知道为什么,但位字段分配没有按预期工作。可能只是一件愚蠢的事情,但我一直无法找到问题所在。

非常欢迎任何帮助。

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(使用前将#替换为@)

位字段结构赋值意外行为 的相关文章

随机推荐