2017-09-21 28 views
-1

所以我有一个位域,像这样:是否将1位宽的位字段设置为2表示位域已设置或未设置?

unsigned int foobar:1; 

然后我将它使用此代码

uint32_t code = loadCode(); 
structure.foobar = code & 2; 

所以,如果code设置为2,将这个意味着foobar的设置为1 ,0还是未定义?我使用的确切标准实际上是C++ 11,不是纯C.

+0

在我看来,这将是一个零......想一想。 2 = 0000010.您的位域是一位。如果你和你的二进制值相同,那位仍然被清除。 –

+0

顺便说一句,这不是家庭作业,当我们意识到我们团队中没有人知道这是否是标准定义的行为时,这是从代码审查中提出来的,不确定为什么downvote。 – Earlz

+0

@DavidHoelzer这也是我的想法,但随后C++具有布尔转换(也就是'x> 0 = true')的怪异语义,也可能适用于位域 – Earlz

回答

7

[expr.ass]/6

当赋值运算符的左操作数是一个位字段 不能代表的值该表达式,结果值 位字段是实现定义的。

类似地,对于initialization

当初始化用一个值,它不能表示一个位字段, 位域的所得到的值是实现定义。

这是由DR 1816加入。作为修复标准中的错误的缺陷报告,它实际上是追溯性的。

+0

我在C++ 11规范中没有看到这个,这是来自一个更新的规范吗? C++ 11中的[expr.ass]/6是*“当赋值运算符的左操作数表示对T的引用时,该操作将分配给由参考表示的T型对象 。”* – cdhowie

+1

看起来像它是[DR1816](http://wg21.link/CWG1816)。 –

+0

啊,所以这是固定在C++ 14?那么我想,对于C++ 11来说,答案是“这取决于你如何阅读规范?” – cdhowie