我有一个带位域的结构(总共32位宽),我有一个32位变量。当我尝试将变量值分配给我的结构时,出现错误:


struct CPUIDregs
    {
       uint32_t EAXBuf;
    };
CPUIDregs CPUIDregsoutput;


int main () {

 struct CPUID
    {
          uint32_t   Stepping         : 4;
          uint32_t   Model            : 4;
          uint32_t   FamilyID         : 4;
          uint32_t   Type             : 2;
          uint32_t   Reserved1        : 2;
          uint32_t   ExtendedModel    : 4;
          uint32_t   ExtendedFamilyID : 8;
          uint32_t   Reserved2        : 4;
    };

    CPUID CPUIDoutput = CPUIDregsoutput.EAXBuf;

您是否知道如何以最短的方式进行操作?谢谢

P.S.当然,在实际代码中,EAX具有更合适的值(value),但是我想它不会在这里产生影响。

最佳答案

您永远不应该依赖于编译器如何在内存中布置您的结构。有多种方法可以完成一项任务,但我既不推荐也不告诉您。

进行分配的最佳方法如下:

static inline void to_id(struct CPUid *id, uint32_t value)
{
    id->Stepping         = value & 0xf;
    id->Model            = value >> 4 & 0xf;
    id->FamilyID         = value >> 8 & 0xf;
    id->Type             = value >> 12 & 0x3;
    id->Reserved1        = value >> 14 & 0x3;
    id->ExtendedModel    = value >> 16 & 0xf;
    id->ExtendedFamilyID = value >> 20 & 0xff;
    id->Reserved2        = value >> 28 & 0xf;
}

与之相反
static inline uint32_t from_id(struct CPUid *id)
{
    return id->Stepping
         | id->Model << 4
         | id->FamilyID << 8
         | id->Type << 12
         | id->Reserved1 << 14
         | id->ExtendedModel << 16
         | id->ExtendedFamilyID << 20
         | id->Reserved2 << 28;
}

10-05 18:13