1

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

是否绝对保证 的值为val8 位长?此外,是否保证a是 的最高位val,并且b是第二位?我想做这样的事情:

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

因此,输入特定标志后,返回一个带有完全相反标志的联合(11001100 -> 00110011)。实际的函数更复杂,并且要求的大小val正好是 8。我也想以相同的方式执行 AND 和 OR,因此每个ab值都在我期望它们的位置和我期望的大小是至关重要的他们是。

4

1 回答 1

1

如何打包这些位不是标准的,并且几乎是定义的实现。看看这个答案

与其依赖联合,不如使用位掩码来派生值。对于上面的例子,char foo可以使用。所有操作(如 ~)都将仅在 foo 上完成。要获取或设置位特定值,可以使用适当的位掩码。

#define BITMASK_A  0x80
#define BITMASK_B  0x40

等等..

要获取“a”位的值,请使用:

foo & BITMASK_A

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

foo | BITMASK_A

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

foo & (~BITMASK_A)
于 2013-10-21T04:27:24.527 回答