我有一個特殊的問題,我有一個16位結構。在結構內部,在成員「x_pos」之後,取決於某個外部標誌,接下來的5位表示不同的東西。格式化在C位域內的聯盟
如果設置了外部標誌,它們是旋轉&縮放參數(rotscale_param),否則高兩位是水平和垂直翻轉位。
我試圖用聯合表示這個結構,但是當我這麼sizeof(屬性)時,我期待看到2個字節,但結果是4個字節。
我的代碼:
typedef unsigned short u16;
struct attribute {
u16 x_pos : 9;
union {
u16 rotscale_param : 5;
struct {
u16 unused : 3;
u16 hflip : 1;
u16 vflip : 1;
};
};
u16 size : 2;
};
如果有幫助,我試圖讓C代碼爲這種結構:http://problemkaputt.de/gbatek.htm#lcdobjoamattributes
這裏是一個:以上報價
OBJ Attribute
Bit Expl.
0-8 X-Coordinate
When Rotation/Scaling used:
9-13 Rotation/Scaling Parameter Selection
When Rotation/Scaling not used:
9-11 Not used
12 Horizontal Flip
13 Vertical Flip
14-15 OBJ Size
來源潛在解決方案:
typedef struct attr_flag_set {
u16 x_pos : 9;
u16 rotscale_param : 5;
u16 size : 2;
};
typedef struct attr_flag_unset {
u16 x_pos : 9;
u16 unused : 3;
u16 hflip : 1;
u16 vflip : 1;
u16 size : 2;
};
union attribute_1 {
attr_flag_unset attr_unset;
attr_flag_set attr_set;
};
但我不確定這是否是理想的解決方案。
您不能假設您的編譯器會將您的位域結構打包到最緊密的空間中。檢查你的編譯器文檔,看看是否有可能導致這種情況發生的選項,但假設它會自動發生是錯誤的(如果連編譯器都允許的話)。 – mah
@mah:除了union之外,難道你不認爲將一個結構中的9位字段和2位字段背靠背結合在一起是合理的嗎? –
[c union和bitfields]的可能重複(http://stackoverflow.com/questions/3087057/c-union-and-bitfields) – mah