重新开始,做回自我,爱拼的男人最牛!
分类: 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; };