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

时间:2012-12-06 07:37:05

标签: c bit-fields bit-packing

在以下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;

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

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

预计会出现这种情况吗?为什么我不能将char [4]与短片一起包装:13?有没有办法实现它?

2 个答案:

答案 0 :(得分:8)

a2不是位字段,因此永远不会与a1放在一起。标准说

  

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

所以这样的子对象必须是一个可寻址的单元,并且该规则没有例外。

答案 1 :(得分:1)

(评论太久了,所以我把它作为答案)

要将所有字段打包在一起,必须用4个字段替换数组:

typedef struct _a {
    short a1:13 __attribute__((packed));
    char a2_0:8 __attribute__((packed));
    char a2_1:8 __attribute__((packed));
    char a2_2:8 __attribute__((packed));
    char a2_3:8 __attribute__((packed));
} a;