在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位长吗?此外,是否保证a
是val
中最重要的位,而b
是第二重要位?我希望做这样的事情:
foo performLogicalNOT(foo x){
foo product;
product.val = ~x.val;
return product;
}
因此,通过输入特定标志,返回具有完全相反标志(11001100 -> 00110011
)的联合。实际函数更复杂,要求val
的大小正好为8.我还想以相同的方式执行AND和OR,因此每个a
和{{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)