将值分配给长度为1的位域

时间:2012-10-04 14:10:21

标签: c++ c binary bit-fields

假设我有

struct A
{
    signed char a:1;
    unsigned char b:1;
};

如果我有

A two, three;
two.a = 2; two.b = 2;
three.a = 3; three.b = 3;

two将在其字段中包含0,而three将包含1。所以,这让我想到,为一个比特字段分配一个数字得到最低有效位(210二进制而311

所以,我的问题是 - 这是正确的跨平台吗?或者它取决于机器,编译器等。标准是否说明了这一点,还是完全实现了定义?

注意:通过分别分配01而不是23,可以获得相同的结果。我使用23只是为了说明我的问题,我不会在现实世界中使用它

<子> P.S。而且,是的,我对两者都感兴趣 - CC++,请不要告诉我他们是不同的语言,因为我知道这一点:)

1 个答案:

答案 0 :(得分:4)

这种情况下的规则与全宽算法的情况没有什么不同。位字段的行为与相应的全尺寸类型的行为相同,只是它们的宽度受位字段声明中指定的值(C99中的6.7.2.1/9)限制。

为有符号的位字段分配溢出值会导致实现定义的行为,这意味着您使用位字段a观察到的行为通常不可移植。

为无符号位字段分配溢出值使用模运算的规则,这意味着该值取模2^N,其中N是位字段的宽度。这意味着,例如,为位字段b分配偶数将始终产生值0,而将奇数分配给此位字段将始终产生1