C中的位字段内存使用情况

时间:2016-10-25 16:58:18

标签: c struct field bit

为什么它以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;

1 个答案:

答案 0 :(得分:6)

字段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);的行为。