2

我想使用 cpp 的位域功能。
但是我得到了各种奇怪的行为,我想知道是否有
办法限制编译器。

我想使用这个位字段:

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 支持也将受到祝福。

*我阅读了一些关于包装的帖子,但它并没有改变对齐问题。

谢谢!

4

1 回答 1

2

我希望您的代码不会编译。 rawData有一个数组类型;this 隐式转换为指针,但不能隐式或显式转换为类类型。

其余的,编译器如何布置位字段是实现定义的,但在你的情况下,我希望它是无关紧要的;在 32 位机器上,32 位位域通常会强制编译器使用下一个字,因此只有第一个位域有任何影响。根据编译器的不同,它会导致编译器将值放在高 8 位或低 8 位(并保留字的其余部分未定义)。

如果您需要匹配外部格式,唯一可靠的方法是逐字节插入该字节所需的任何值。

于 2012-05-21T08:11:53.527 回答