首先,有問題的應用程序總是在同一個處理器上,編譯器總是gcc,所以我不關心位域不可移植。如何獲得位域以正確的順序排列我的位?
gcc設置位域,使得第一個列出的字段對應於一個字節的最低有效位。所以下面的結構,具有一個 = 0,b = 1,Ç = 1,d = 1,將得到的值E0的一個字節。
struct Bits {
unsigned int a:5;
unsigned int b:1;
unsigned int c:1;
unsigned int d:1;
} __attribute__((__packed__));
(其實,這是C++,所以我說的是G ++)
現在,讓我們說,我想一個是一個六位整數。
現在,我可以看到爲什麼這是不行的,但我的編碼結構如下:
struct Bits2 {
unsigned int a:6;
unsigned int b:1;
unsigned int c:1;
unsigned int d:1;
} __attribute__((__packed__));
設置b,Ç,並d爲1,一個爲0導致以下兩個字節:
c0 01
這不是我想要的。我希望看到這一點:
e0 00
有什麼方法來指定在第一個字節的最顯著位三位和六位跨越第一字節和五個最顯著位的結構第二個最重要的位?
請注意,我無法控制這些位應該放在哪裏:它是由別人的界面定義的位佈局。
「gcc列出位域,使得第一個列出的字段對應於一個字節的最低有效位。」不,GCC(在這種情況下包括'g ++',它繼承C實現定義的行爲)以ABI依賴的順序列出位域:https://gcc.gnu.org/onlinedocs/gcc/Structures-unions-enumerations-和-bit-fields-implementation.html。無論這種情況發生在你的架構上,都是偶然的。 – 2016-01-05 13:38:18