C中的位域内存使用

Bit field memory usage in C

为什么 return 是 96 而不是 64? 如果我对位域的位求和,我将得到 64。

已编辑:

var 变量有 0xFFFFFF 而不是 0xFFFFFFFF -> var 变量有 0x3FFFFFFF00FFFFFF 而不是 0xFFFFFFFFFFFFFFFF.*

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

typedef struct{
    uint32_t a : 24;
    uint32_t b : 20;
    uint32_t c : 10;
    uint32_t d : 6;
    uint32_t e : 4;
}MyType_t;

int main(){
    MyType_t test;
    test.a = -1;
    test.b = -1;
    test.c = -1;
    test.d = -1;
    test.e = -1;

    uint64_t var = *((uint64_t*)&test);

    printf("MyType_t: %d bit\n", sizeof(MyType_t) * 8);//96 bit
    printf("Var: %#llX\n", var);//0x3FFFFFFF00FFFFFF
    return 0;
}

此代码将正确运行:

typedef struct{
    uint32_t a : 16;
    uint32_t b : 16;
    uint32_t c : 16;
    uint32_t d : 8;
    uint32_t e : 8;
}MyType_t;

字段 a 和 b 不可能适合单一类型 uint32_t:

typedef struct{
    uint32_t a : 24;    //first 32 bits
    uint32_t b : 20;    //second 32 bits
    uint32_t c : 10;    //
    uint32_t d : 6;     //third 32 bits
    uint32_t e : 4;     //
}MyType_t;

所以结构的大小是uint32_t的三倍。


代码的行为 uint64_t var = *((uint64_t*)&test); 未定义。