重新开始,做回自我,爱拼的男人最牛!
分类: C/C++
2019-12-19 16:58:35
struct bs{
unsigned m;
unsigned n: 4;
unsigned char ch: 6;
};
#include "stdio.h"
int main(){
struct bs{
unsigned m;
unsigned n: 4;
unsigned char ch: 6;
} a = { 0xad, 0xE, '$'};
//第一次输出
printf("%#x, %#x, %c\n", a.m, a.n, a.ch);
//更改值后再次输出
a.m = 0xb8901c;
a.n = 0x2d;
a.ch = 'z';
printf("%#x, %#x, %c\n", a.m, a.n, a.ch);
return 0;
}
关于C语言标准以及 ANSI C 和 C99 的区别,我们已在付费教程《》中进行了讲解。但编译器在具体实现时都进行了扩展,额外支持了 char、signed char、unsigned char 以及 enum 类型,所以上面的代码虽然不符合C语言标准,但它依然能够被编译器支持。
#include "stdio.h"
int main(){
struct bs{
unsigned m: 6;
unsigned n: 12;
unsigned p: 4;
};
printf("%d\n", sizeof(struct bs));
return 0;
}
sizeof(struct bs) 的大小之所以为 4,而不是 3,是因为要将内存对齐到 4 个字节,以便提高存取效率,这将在《》专题的《》一节中详细讲解。如果将成员 m 的位宽改为 22,那么输出结果将会是 8,因为 22+12 = 34,大于 32,n 会从新的位置开始存储,相对 m 的偏移量是 sizeof(unsigned int),也即 4 个字节。
#include "stdio.h"
int main(){
struct bs{
unsigned m: 12;
unsigned char ch: 4;
unsigned p: 4;
};
printf("%d\n", sizeof(struct bs));
return 0;
}
m 、ch、p 的长度分别是 4、1、4 个字节,共计占用 9 个字节内存,为什么在 VC/VS 下的输出结果却是 12 呢?这个疑问将在《》专题的《》一节中为您解开。3) 如果成员之间穿插着非位域成员,那么不会进行压缩。例如对于下面的 bs:
struct bs{
unsigned m: 12;
unsigned ch;
unsigned p: 4;
};
struct bs{
int m: 12;
int : 20; //该位域成员不能使用
int n: 4;
};