我想使用cpp的位字段功能
然而,我得到了各种奇怪的behivours,我想知道是否有
一种约束编译器的方法。
我想使用这个位字段:
class MyBitField
{
uint32 a : 8;
uint32 b : 32;
uint32 c : 32;
}
现在使用此代码:
uint8 rawData[9] = {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xFF, 0xFF};
MyBitField \*pMyBitField = (MyBitField\*)rawData;
我期待(在小端32位CPU上):
pMyBitField的a字段为0x12,
pMyBitField的b字段为0x9A785634,
pMyBitField的a字段为0xFFFFDEBC。
编译器选择进行一些无法解释的对齐
我知道,如果你在比特档内使用不同的类型,你可能会对齐,但事实并非如此
我该怎么办?
让我们专注于Visual Studio 2005,但任何其他env支持也将受到祝福。
*我读了一些包装的帖子,但没有改变对齐问题。
谢谢!
答案 0 :(得分:2)
我希望你的代码不能编译。 rawData
有一个数组类型;这个
隐式转换为指针,但不能转换为类
类型,隐式或显式。
对于其余部分,编译器如何布置位字段是实现 定义,但在你的情况下,我希望它是无关紧要的;在32位 机器,一个32位的位域通常会强制编译器使用 下一个字,所以只有第一个字段有任何影响。取决于 编译器,它会导致编译器将值放在高位 8位,或低位8位(并留下其余的字 未定义)。
如果您需要匹配外部格式,这是实现此目的的唯一方法 可靠地逐字节,插入任何必要的值 字节。