假设我有
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
。所以,这让我想到,为一个比特字段分配一个数字得到最低有效位(2
是10
二进制而3
是11
)
所以,我的问题是 - 这是正确的跨平台吗?或者它取决于机器,编译器等。标准是否说明了这一点,还是完全实现了定义?
注意:通过分别分配0
和1
而不是2
和3
,可以获得相同的结果。我使用2
和3
只是为了说明我的问题,我不会在现实世界中使用它
<子> P.S。而且,是的,我对两者都感兴趣 - C
和C++
,请不要告诉我他们是不同的语言,因为我知道这一点:)
答案 0 :(得分:4)
这种情况下的规则与全宽算法的情况没有什么不同。位字段的行为与相应的全尺寸类型的行为相同,只是它们的宽度受位字段声明中指定的值(C99中的6.7.2.1/9)限制。
为有符号的位字段分配溢出值会导致实现定义的行为,这意味着您使用位字段a
观察到的行为通常不可移植。
为无符号位字段分配溢出值使用模运算的规则,这意味着该值取模2^N
,其中N
是位字段的宽度。这意味着,例如,为位字段b
分配偶数将始终产生值0
,而将奇数分配给此位字段将始终产生1
。