在 C 语言中有好几次保证类型至少是某个特定大小,但不一定正好是那个大小(sizeof(int)
可以导致 2 或 4)。但是,我需要绝对确定某些大小和内存位置。如果我有如下 union :
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;
}
因此,通过输入特定标志,返回具有完全相反标志的 union (11001100 -> 00110011
)。实际的功能比较复杂,要求val
的大小恰好为8。我也想用同样的方式进行AND和OR,所以至关重要的是每个a
和 b
值是我期望的位置和我期望的大小。
最佳答案
这些位的打包方式不是标准的,而且几乎已经定义了实现。看看这个answer .
与其依赖 Union,不如使用 bitmask 来导出值。对于上面的示例,可以使用 char foo
。所有操作(如 ~)将仅在 foo 上完成。要获取或设置位特定值,可以使用适当的位掩码。
#define BITMASK_A 0x80
#define BITMASK_B 0x40
等等..
要获取“a”位的值,请使用:
foo & BITMASK_A
要将该位设置为 1,请使用:
foo | BITMASK_A
要将该位重置为 0,请使用:
foo & (~BITMASK_A)
关于c - 特定大小和顺序的位字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19485959/