c-为长度为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;
两个将在其字段中包含0,而三个将包含1.因此,这让我认为,将数字分配给单个位字段将获得最低有效位(二进制中2为10,而3为11).
所以,我的问题是-这是正确且跨平台的吗?还是取决于机器,编译器等.标准是否对此有所说明,或者完全由实现定义?
注意:通过分配0和1而不是分别分配2和3可以实现相同的结果.我使用2和3只是为了说明我的问题,我不会在现实世界中使用它
附:而且,是的,我对C和C都很感兴趣,请不要告诉我它们是不同的语言,因为我知道这一点:)
解决方法:
在这种情况下的规则与在全角算术的情况下没有什么不同.位域的行为与相应的全尺寸类型相同,不同之处在于位域的宽度受您在位域声明(C99中的6.7.2.1/9)中指定的值限制.
将溢出的值分配给带符号的位字段会导致实现定义的行为,这意味着您使用位字段a观察到的行为通常不可移植.
将溢出值分配给无符号位域使用模算术规则,这意味着该值以2 ^ N取模,其中N是位域的宽度.例如,这意味着向位域b分配偶数将始终产生值0,而向该位域分配奇数将始终产生1.
标签:c-3,bit-fields,c,binary 来源: https://codeday.me/bug/20191009/1878693.html