1

假设我有

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;

two0在其字段中包含 s,而three将包含1s。因此,这让我想到,将数字分配给单个位字段会获得最低有效位(210二进制并且311)。

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

0注意:通过分配和1,而不是2和可以达到相同的结果3。我使用2并且3只是为了说明我的问题,我不会在现实世界中使用它

PS 而且,是的,我对这两种语言都很感兴趣 -CC++,请不要告诉我它们是不同的语言,因为我知道这一点 :)

4

1 回答 1

4

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

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

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

于 2012-10-04T14:13:16.553 回答