字符在結構
回答
該char c:4
意味着它是一個char
大小的變量,其中4位是變量c
。換句話說,c
並不是指整個8位char
的內存空間,只有它的四個位。這是一種將比特填充標誌和非常見數據大小結構化的機制。
位域是C語言的一個奇特功能,它的確切規格和行爲多年來一直有些不一致; C標準的後續版本已經確定了行爲的某些方面足以阻止編譯器做一些有用的事情,但還不足以使它們以任何有用的方式進行移植。
如果一個結構的兩個或多個連續成員具有相同的底層整數類型,並且其字段名稱後跟一個冒號和一個數字,編譯器會嘗試將第一個後面的每個成員打包到同一個存儲元素中前一個。如果不能這樣做,它將前進到下一個存儲元素。
因此,機器,其中unsigned short
爲16位,一個聲明上:
struct {
unsigned short a1 : 5;
unsigned short a2 : 5;
unsigned short a3 : 7;
unsigned short a4 : 5;
unsigned short a5 : 4;
unsigned short a6 : 6;
}
編譯器將包A1和A2爲一個16位的整數;由於a3不適合與a1和a2相同的整數(總數爲17位),它將啓動一個新的。雖然a4會與a1和a2相媲美,但a3也是如此,這意味着它將與a3一起放置。然後a5將放置a3和a4,填滿第二個點。 A6將會擁有一個16位的位置。
請注意,如果所有這些結構元素的基礎類型都是32位的unsigned int
,那麼所有東西都可能被打包成一個這樣的項目,而不是三個16位的項目。
坦率地說,我真的不喜歡圍繞位域的規則。它們的規則足夠模糊,以至於一個編譯器爲位域數據生成的底層表示可能不會被另一個可讀,但它們具有足夠的特定性,即編譯器被禁止生成可能是有用數據結構的內容(例如,應該可以將四個6位數字轉換爲3字節(24位)結構,但除非編譯器碰巧有24位整數類型,否則可以請求它)。儘管如此,這些規則就是他們的。
感謝您花時間撰寫了一篇足智多謀的評論,在這篇評論中您分享了位域經驗。乾杯 – ssBarBee 2013-04-09 18:42:56
- 1. 字符* []結構
- 2. 字符「*」,在新結構化
- 3. 字符的結構和字符串
- 4. 更改結構字符串
- 5. C#字符串去結構
- 6. 結構字符串問題
- 7. C++結構和字符
- 8. C字符串結構
- 9. 字符串在結構用C
- 10. 在結構中填充字符指針
- 11. 在結構中存儲字符串
- 12. 指針在結構常數字符串
- 13. 的C 2維字符在結構
- 14. 在結構中操作字符串C
- 15. 是否可以序列化C結構(結構)的JSON字符串(字符*)
- 16. 鑄字字符的結構類型
- 17. golang字符串結構結構(不含數據)
- 18. 構建逗號在C#中分隔字符串從結構
- 19. 結構符號
- 20. 結構字符數組使用
- 21. 更改JSON字符串結構
- 22. Python結構字符串到bin
- 23. 結構中的字符問題
- 24. 當結構體字符串重疊
- 25. C++處理'結構'和字符串
- 26. 如何換行長字符串結構?
- 27. 字符串的結構數組
- 28. 反思:結構由字符串
- 29. C-指定字符的結構*
- 30. Python的結構發送字符
谷歌對於「位域」 – 2013-04-08 17:46:32
如果他不知道它是什麼,他將如何谷歌的位域?給後續鏈接提供簡短的解釋並不是更有益嗎? – Hydronium 2013-04-08 17:48:07
他只是告訴他要搜索的關鍵字。 – jrok 2013-04-08 17:48:26