10

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

错误:请求从“uint32_t {aka unsigned int}”转换为非标量类型“main()::CPUID”。

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;

你知道如何以最短的方式做到这一点吗?谢谢

PS当然我在实际代码中有更合适的EAX值,但我想它不会影响这里。

4

4 回答 4

14

您永远不应该依赖编译器如何在内存中布置您的结构。有很多方法可以通过单个作业完成您想做的事情,但我既不会推荐也不会告诉您。

完成任务的最佳方法如下:

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;
}
于 2012-06-01T14:27:15.517 回答
10

使用工会。

union foo {
    struct {
        uint8_t a : 4;
        uint8_t b : 4;
        uint8_t c : 4;
        uint8_t d : 4;
        uint16_t e;
    };
    uint32_t allfields;
};

int main(void) {
    union foo a;

    a.allfields = 0;
    a.b = 3;

    return 0;
}
于 2016-06-08T20:12:53.957 回答
2

如果有人感兴趣,我有一个更好的解决方案来解决我自己的问题:

*(reinterpret_cast<uint32_t *> (&CPUIDoutput)) = CPUIDregsoutput.EAXBuf;
于 2012-06-04T10:32:27.367 回答
1

这些是结构成员,因此您需要直接分配它们,或者确保您的分配的 RHS 是 type 的值CPUID。不知道为什么您希望能够从整数分配给结构。

结构包含位域的事实,并且位的总和恰好与您尝试分配的整数中的位数相同,这毫无意义。出于分配目的,它们仍然不是兼容的类型。

如果这太模糊,请考虑显示更多/更好的代码。

于 2012-06-01T13:43:51.410 回答