如何用char数组打包短整数的位字段?

bad*_*mad 1 c bit-packing bit-fields

在以下2个结构中,

typedef struct _a {
    short a1:13 __attribute__((packed));
    char a2[4]  __attribute__((packed));
} a;

typedef struct _b {
    short b1:10 __attribute__((packed));
    short b2:10 __attribute__((packed));
    short b3:12 __attribute__((packed));
} b;
Run Code Online (Sandbox Code Playgroud)

struct b,我发现b2的位用b1打包,b3的位用b2打包.它最终导致4字节值.

我期待类似的行为,struct a但我看不出相同.前2个字节用a1(未使用的5位)占用,后跟4个字节用于a2.

这种行为有望吗?为什么我不能将char [4]与短片一起包装:13?有没有办法实现它?

Jen*_*edt 8

a2不是一个位字段,所以它永远不会被放在一起a1.标准说

存储在任何其他对象类型的非位字段对象值由n个×CHAR_BIT位,其中n是该类型的对象的大小,以字节为单位.可以将该值复制到unsigned char [n]类型的对象中(例如,通过memcpy); 生成的字节集称为值的对象表示.

因此,这样的子对象必须是可寻址的单元,并且该规则没有例外.