c++ - 结构/类位域打包

标签 c++ c bit-manipulation

我想使用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,但任何其他环境支持也将受到祝福。

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

谢谢!

最佳答案

我希望你的代码无法编译。 rawData 具有数组类型;这 隐式转换为指针,但不能转换为类 类型,隐式或显式。

剩下的,编译器如何布局位域是实现 已定义,但就您而言,我希望它是无关紧要的;在 32 位上 机器,32 位位域通常会强制编译器使用 下一个字,因此只有第一位字段有效。取决于 编译器,它会导致编译器将值放在高位 排序 8 位,或低 8 位(并保留字的其余部分 未定义)。

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

关于c++ - 结构/类位域打包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10681256/

相关文章:

c++ - Linux C++ 线程已死,但 "hanging"- 线程限制

c - 如何发送大二维数组的 block 以进行处理

c# - 您如何随机将整数中的一位归零?

c++ - 为写入指针 API 创建行为良好的迭代器

c++ - 如何使用 std::auto_ptr 声明动态数组?

c++ - 将传递引用转换为传递返回

c - 如何使用scanf读取带空格的文件的每一行?

c - 指向指向 const char 的指针的地址的数据类型

algorithm - 最小化 K 切割后最大组的大小

c++ - 我如何使用 6 位来存储值?