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);
未定义。
为什么 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);
未定义。