簡體   English   中英

VStudio C ++聯合中的位域對齊

[英]VStudio c++ alignment of bitfield in union

在VStudio 2010中,我試圖創建一個聯合以方便地訪問2字節值:

#pragma pack(push,1) // disable padding
typedef struct {
    uint8_t r:3;
    uint8_t g:3;
    uint8_t b:3;
}tsRgb;

typedef union {
    uint16_t raw;
    tsRgb rgb; 
}tPixelData;
#pragma pack(pop)

int main(){
    tPixelData pixel;
    pixel.raw = 0xABE5;
    return 0;
}

我期望看到p​​ixel.r = 5,pixel.g = 4,pixel.b =7。r和g都可以,但是b是3。

我究竟做錯了什么? 我認為我沒有正確分配位?

第三個字段將在一個單獨的字節中。

在VC ++中,位域不會跨越基礎類型的邊界。 使用3 + 3位后,僅剩2位,因此下一個字段將使用新字節中的3位。

如果使用uint16_t而不是uint8_t可能會更好。

“禁用填充”在字節級別上起作用,而不在位級別上起作用。

想要使用位域從根本上來說是有問題的。 根據C標准 6.7.2.1結構和聯合說明符第11段(因為您的問題也被標記為C):

一個實現可以分配任何足夠大的可尋址存儲單元以容納一個位字段。 如果有足夠的空間,則應將緊隨結構中另一個位域之后的位域打包到同一單元的相鄰位中。 如果剩余空間不足,則將實現不適當的位字段放入下一個單元還是與相鄰單元重疊。 單位內的位域分配順序(從高位到低位或從低位到高位)由實現定義。 未指定可尋址存儲單元的對齊方式。

位域中位的布局和對齊方式均由實現定義。 字段可以跨也可以不跨存儲單元邊界,可以以任何順序存儲。

它們根本不是便攜式的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM