2017-09-21 51 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