2013-10-21 68 views
1

C中有幾種類型保證至少有一定的尺寸,但不一定是這個尺寸(sizeof(int)可能會導致2或4)。但是,我需要確定一些尺寸和內存位置。如果我有一個工會,如下面:特定尺寸和順序的位字段

typedef union{ 
    struct{ 
     unsigned int a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1; 
    }; 
    unsigned int val:8; 
} foo; 

難道是絕對保證的val值是8位長?而且,aval的最高位,b是第二重要位?我願做這樣的事情:

foo performLogicalNOT(foo x){ 
    foo product; 
    product.val = ~x.val; 
    return product; 
} 

從而與特定標誌的輸入,返回聯盟與完全相反的標誌(11001100 -> 00110011)。實際功能更復雜,並且要求val的大小恰好爲8.我還希望以相同的方式執行AND和OR,所以每個ab值都應該是我期望的值,我期望他們是。

+2

[位域不可移植,C不能保證機器字中字段的排序](http://stackoverflow.com/a/1044689/183120)。 – legends2k

回答

1

這些位如何被打包並不是標準的,並且定義了很多實現。看看這個answer

而不是依靠聯盟,最好使用位掩碼來導出值。對於上面的例子,可以使用char foo。所有操作(如〜)只能在foo上完成。要獲取或設置特定於位的值,可以使用適當的位掩碼。

#define BITMASK_A 0x80 
#define BITMASK_B 0x40 

等..

要獲得 'A' 位,使用值:

foo & BITMASK_A 

要將位設置爲1,用途:

foo | BITMASK_A 

要將該位重置爲0,請使用:

foo & (~BITMASK_A) 
+0

非常感謝你,這正是我所需要的。你可能剛剛從我們的高級項目中拯救了一個可能是一個討厭的bug。我將返回到位掩碼。然而,假設'a'恰好是1位,還是這個實現是特定的,是否正確? – BrainSteel