特定大小和顺序的位字段

时间:2013-10-21 03:47:30

标签: c sizeof bit-fields

在C中有几次保证类型保持最小特定大小,但不一定完全相同(sizeof(int)可以导致2或4)。但是,我需要绝对确定某些尺寸和内存位置。如果我有一个如下所示的联盟:

typedef union{
    struct{
        unsigned int a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
    };   
    unsigned int val:8;
} foo;

绝对保证val的值是8位长吗?此外,是否保证aval中最重要的位,而b是第二重要位?我希望做这样的事情:

foo performLogicalNOT(foo x){
    foo product;
    product.val = ~x.val;
    return product;
}

因此,通过输入特定标志,返回具有完全相反标志(11001100 -> 00110011)的联合。实际函数更复杂,要求val的大小正好为8.我还想以相同的方式执行AND和OR,因此每个a和{{1值是我期望它们的位置和我期望它们的大小。

1 个答案:

答案 0 :(得分:1)

如何打包这些位不是标准的,而是实现了很多实现。看看这个answer

最好使用位掩码来获取值,而不是依赖于Union。对于上面的示例,可以使用char foo。所有操作(如〜)只能在foo上完成。要获取或设置位特定值,可以使用适当的位掩码。

#define BITMASK_A  0x80
#define BITMASK_B  0x40

依旧......

要获得'a'位的值,请使用:

foo & BITMASK_A

要将该位设置为1,请使用:

foo | BITMASK_A

要将该位重置为0,请使用:

foo & (~BITMASK_A)