所以我有一个位域,像这样:是否将1位宽的位字段设置为2表示位域已设置或未设置?
unsigned int foobar:1;
然后我将它使用此代码
uint32_t code = loadCode();
structure.foobar = code & 2;
所以,如果code
设置为2,将这个意味着foobar的设置为1 ,0还是未定义?我使用的确切标准实际上是C++ 11,不是纯C.
所以我有一个位域,像这样:是否将1位宽的位字段设置为2表示位域已设置或未设置?
unsigned int foobar:1;
然后我将它使用此代码
uint32_t code = loadCode();
structure.foobar = code & 2;
所以,如果code
设置为2,将这个意味着foobar的设置为1 ,0还是未定义?我使用的确切标准实际上是C++ 11,不是纯C.
当赋值运算符的左操作数是一个位字段 不能代表的值该表达式,结果值 位字段是实现定义的。
类似地,对于initialization:
当初始化用一个值,它不能表示一个位字段, 位域的所得到的值是实现定义。
这是由DR 1816加入。作为修复标准中的错误的缺陷报告,它实际上是追溯性的。
在我看来,这将是一个零......想一想。 2 = 0000010.您的位域是一位。如果你和你的二进制值相同,那位仍然被清除。 –
顺便说一句,这不是家庭作业,当我们意识到我们团队中没有人知道这是否是标准定义的行为时,这是从代码审查中提出来的,不确定为什么downvote。 – Earlz
@DavidHoelzer这也是我的想法,但随后C++具有布尔转换(也就是'x> 0 = true')的怪异语义,也可能适用于位域 – Earlz