所以我有一個位域,像這樣:是否將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