c - 特定大小和顺序的位字段

标签 c sizeof bit-fields

在 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位长?此外,是否保证aval的最高位,而b是第二位?我想做这样的事情:

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

因此,通过输入特定标志,返回具有完全相反标志的 union (11001100 -> 00110011)。实际的功能比较复杂,要求val的大小恰好为8。我也想用同样的方式进行AND和OR,所以至关重要的是每个ab 值是我期望的位置和我期望的大小。

最佳答案

这些位的打包方式不是标准的,而且几乎已经定义了实现。看看这个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/

相关文章:

C++ 2位位域数组可能吗?

c++ - 包含位字段的结构的大小

C:逐行读取文件

c++ - 读取时文件被删除并重新创建。如何处理?

c - 当在被调用函数中调用 sizeof 运算符时,会发生什么?

c - 为什么 int 指针的大小与 int 数组的大小不同?

c++ - 静态分配的内存在其范围结束后会发生什么?

c++ - shutdown() 和 closesocket() 在 SOCKET 上的 send() 之后不久

c++ - 使用 sizeof() 计算数组大小

c++ - 访问位域 union 是 C++ 标准中常见的初始数据未定义行为