联合中位域的 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;
}

我期待 pixel.r = 5,pixel.g = 4,pixel.b = 7。 r 和 g 没问题,但 b 是 3.

我做错了什么?我假设我没有正确对齐位?

第三个字段将在一个单独的字节中。

在VC++中,位域不跨越基础类型的边界。当您使用了 3+3 位时,只剩下 2 位,因此下一个字段将使用新字节中的 3 位。

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

"Disable padding" 工作在字节级别,而不是位级别。

如你所愿地使用位域从根本上是有问题的。根据 the C Standard6.7.2.1 结构和联合说明符,第 11 段(因为您的问题也被标记为 C):

An implementation may allocate any addressable storage unit large enough to hold a bit- field. If enough space remains, a bit-field that immediately follows another bit-field in a structure shall be packed into adjacent bits of the same unit. If insufficient space remains, whether a bit-field that does not fit is put into the next unit or overlaps adjacent units is implementation-defined. The order of allocation of bit-fields within a unit (high-order to low-order or low-order to high-order) is implementation-defined. The alignment of the addressable storage unit is unspecified.

位域中位的布局和对齐方式都是实现定义的。字段可能会也可能不会跨越存储单元边界,它们可以按任何顺序存储。

它们根本不便携。