我有以下结构:

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/

10-12 20:53