2009-06-17 89 views
4

我一直以爲我知道ç非常好,直到我看到在另一篇文章是這樣的:關於產品碳構建

struct foo { 
    int x:1; 
}; 

我真的想知道的目的:1。有人能告訴我嗎?謝謝。

回答

11

bitfield。 x是1位長。

每個字段訪問和操作 ,好像它是一個 結構的普通構件。有符號的關鍵字和 無符號意味着你期望的, ,只是有趣的是注意 一個兩個的 補充機器上的1位有符號字段只能取 值0或-1。這些聲明允許包含const和 易失性限定符,其中聲明爲 。

主要使用位域的要麼是 允許數據的緊密堆積或以 能夠指定內的一些 外部產生的數據文件的字段。 C 不能保證機器字內的 字段的順序,所以如果你使用 後面的原因,你的程序將不僅僅是不可移植的,它也會依賴於編譯器。 標準表示字段被打包爲'存儲單元',其中 通常是機器字。包裝 的順序以及位域 是否可能跨越存儲單元邊界,都是 實現定義的。要強制 與存儲單元邊界對齊,請使用 零寬度字段,然後在想要對齊的 之前使用零寬度字段。

小心使用它們。它可能需要 令人驚訝的運行時間代碼量 來操縱這些東西,並且您可以使用更多的空間比使用 保存更多的空間。

位域沒有地址 - 您的 不能有指向它們的指針或它們的數組 。

http://publications.gbdirect.co.uk/c_book/chapter6/bitfields.html

+0

謝謝!但是這只是將它聲明爲一個常規整數有什麼好處? – 2009-06-17 15:58:26

0

即語法用於表示位字段(即比特比數據類型本身窄的場),所以在您的示例中的「X」是真正使用int的1個比特。

一個更有用的例子可能是這樣的

char x:4; 
char y:4; 

這將打包兩個4位字段爲一個字節。當然,優點是節省每個字節都很關鍵的體系結構中的空間。

1

這是一個1位長的字段。關於wikipedia有一個很好的討論。

3

這些是位域。在結構中可以定義多少位分配給變量(覆蓋的變量類型的標準)在上述X,僅使用1個字節的示例

,因此只能採取的值0或1。

請參閱​​中的以下示例。請點擊鏈接瞭解更多信息。

struct { 
     /* field 4 bits wide */ 
     unsigned field1 :4; 
     /* 
     * unnamed 3 bit field 
     * unnamed fields allow for padding 
     */ 
     unsigned  :3; 
     /* 
     * one-bit field 
     * can only be 0 or -1 in two's complement! 
     */ 
     signed field2 :1; 
     /* align next field on a storage unit */ 
     unsigned  :0; 
     unsigned field3 :6; 
}full_of_fields;