首先看一道C语言题目:
#include<stdio.h> struct testbit{ unsigned char a:3; unsigned char b:2; unsigned char c:3; }; int main()/* 小端模式 */ { struct testbit s; unsigned char *p = (char*)&s; *p = 0xac; fprintf(stdout,"s.a = %d,s.b = %d,s.c = %d\n",s.a,s.b,s.c); return 0; }
首先,我们要明白,什么是大端和小端,关于大小端的定义这里不再赘述。这里需要我们注意的是:一个数字本身没有大小端之分,产生大小端的原因是因为存储方式的不同。
明白了上面这点,在看这道题目。由题目可以得出指针p所指向的内容是0xac( 二进制的1010 1100 ),又因为内存在分配一个结构体中的数据的时候是按照声明的顺序依次分配的,并且还是小端模式,那么
unsigned char a就对应着二进制1010 1100的后3位(100)——4
unsigned char b就对应着二进制1010 1100的中间2位(01) ——1
unsigned char c就对应着二进制1010 1100的前3位(101) ——5