![](/img/trans.png)
[英]How do bit fields actually work? and in what case bit padding happens?
[英]How do bit fields interplay with bits padding in C
當存在填充位時,我有兩個關於位字段的問題。
說我有一個結構定義為
struct T {
unsigned int x: 1;
unsigned int y: 1;
};
結構T僅實際使用了兩位。
問題1:這兩位始終是基礎無符號int的最低有效位嗎? 還是取決於平台?
問題2:那些未使用的30位是否總是初始化為0? C標准對此有何評論?
問題1:這兩位始終是基礎無符號int的最低有效位嗎? 還是取決於平台?
不,它與系統和編譯器有關。 您永遠無法假設或知道它們是MSB或LSB。
問題2:那些未使用的30位是否總是初始化為0? C和C ++標准對此有何評論?
取決於您如何初始化結構。 在本地范圍內未初始化的結構可能包含填充位/字節中的垃圾值。 使用至少一個初始化程序集進行初始化的結構,即使在填充字節中也保證包含零: my_struct = { something };
。
來源
有關上述原因的語言律師細節有些復雜。
C17 6.7.9 / 9(強調我的)說:
除非另有明確說明,否則出於本節的目的,結構和聯合類型的對象的未命名成員不參與初始化。 結構對象的未命名成員即使在初始化后也具有不確定的值。
這意味着我們完全不能相信填充位/字節。 但是上面的規則(§20強調我的規則)有一個例外:
如果用大括號括起來的列表中的初始化程序少於聚合中的元素或成員 ,或者用於初始化已知大小的數組的字符串文字中的字符少於該數組中的元素,則聚合的其余部分應與具有靜態存儲持續時間的對象一樣隱式初始化。
這意味着,如果至少有一個初始化程序,則適用以下靜態存儲初始化規則:
C17 6.7.9 / 10(重點是我的):
如果沒有顯式初始化具有靜態或線程存儲持續時間 的對象 ,則:/-/
- 如果是聚合,則根據這些規則初始化(遞歸)每個成員,並將任何填充初始化為零位 ;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.