我有以下结构:
struct SysData
{
// Topic (32 bits)
UTL_UINT16_Tdef SystemID:11; // set to decimal 25
UTL_UINT16_Tdef TypeID:5; // set to 2 (telemetry type)
UTL_UINT16_Tdef ContentID; // set to decimal 1234
}
SysData MsgHdr;
MsgHdr.SystemID = 25;
MsgHdr.TypeID = 2;
MsgHdr.ContentID = 0;
如果我做这样的事情:
unsigned int a;
memcpy(&a, &MsgHdr, sizeof(MsgHdr));
headerInfo[0] = a & 0x7FF;
headerInfo[1] = (a >> 16) & 31;
headerInfo[2] = (a >> 21) & 0xFFFF;
headerInfo[0] 的值应该是 25,但它有 36。我做错了什么?
最佳答案
您不应该猜测 SysData 的内部表示。编译器可能会选择是否将位字段打包在一起,将它们左对齐或右对齐等。它甚至可以选择将它们映射到 32 位整数以解决性能问题。你就是不知道。位域的未使用部分可能包含垃圾,这可能是您获得 36 的地方。
这很奇怪,但并不难检查。将您的 25 更改为其他值,看看您会得到什么。
但是,将您的结构 memcopy 到一些 unsigned int 可能不是一个好主意。为什么不直接访问位域?就像在 headerInfo[0] = MsgHdr.SystemID;
中一样,这就是位域的用途。在您的示例中, memcopy 只是浪费时间(正如您所见,也很危险)。
关于c++ - C++中的位移,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3428680/