2013-04-08 22 views
3

一個簡單的問題:什麼是焦炭C的含義:在結構4提前下面字符在結構

struct s 
{ 
char c:4; 
} 

感謝給出。

+7

谷歌對於「位域」 – 2013-04-08 17:46:32

+0

如果他不知道它是什麼,他將如何谷歌的位域?給後續鏈接提供簡短的解釋並不是更有益嗎? – Hydronium 2013-04-08 17:48:07

+4

他只是告訴他要搜索的關鍵字。 – jrok 2013-04-08 17:48:26

回答

5

這是一個bit field由一個char的四位部分組成。您可以定義更多比特字段細分更大的類型分爲「nibblets」,像這樣:

struct s 
{ 
char c:4; 
char d:2; 
char e:2; 
}; 

struct定義了三個領域,所有的「包裝」成一個單一的charc字段可以保存十六個不同的值;字段de可以分別保存四個值。

+0

非常有用和快速。謝謝 – ssBarBee 2013-04-08 17:51:14

1

char c:4意味着它是一個char大小的變量,其中4位是變量c。換句話說,c並不是指整個8位char的內存空間,只有它的四個位。這是一種將比特填充標誌和非常見數據大小結構化的機制。

1

位域是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位整數類型,否則可以請求它)。儘管如此,這些規則就是他們的。

+0

感謝您花時間撰寫了一篇足智多謀的評論,在這篇評論中您分享了位域經驗。乾杯 – ssBarBee 2013-04-09 18:42:56