直接看程序吧:
#include <stdio.h>
struct filter
{
unsigned int fl_low:10; //max = 1023
unsigned int fl_hig:10; //max = 1023
};
const struct filter lookup_fl[] = { {0x371,0x2f2},{0x3b1,0x3f5}}; //0xbcb71 0xFD7B1
int main(void)
{
struct filter m1;
m1.fl_hig = 1024;// 溢出 低 10位为0
m1.fl_low = 1;
printf("sizeof(struct filter) = %d.\n", sizeof(struct filter));
printf("m1 = %d.\n", m1);
printf("lookup_fl[0] = 0x%x.\n", lookup_fl[0]);//可以看到C语言是把低10位和高10位拼接起来的。
printf("lookup_fl[0].fl_hig = 0x%x.\n", lookup_fl[0].fl_hig);
printf("lookup_fl[0].fl_low = 0x%x.\n", lookup_fl[0].fl_low);
printf("lookup_fl[1] = 0x%x.\n", lookup_fl[1]);//可以看到C语言是把低10位和高10位拼接起来的,在内存中是连续的
printf("lookup_fl[1].fl_hig = 0x%x.\n", lookup_fl[1].fl_hig);
printf("lookup_fl[1].fl_low = 0x%x.\n", lookup_fl[1].fl_low);
return 0;
}
运行结果:
简单解释,这里我定义了2个10bit的变量作为一个结构体数据类型,分别打印了在内存中占用的字节数,4字节(32位系统),以及低字节和高字节,以及溢出的时候,
值是多少,从上门我们可以看到C语言是把低10位和高10位拼接起来的,在内存中是连续的。
意义:以后可以用位域结合位运算符来执行相关的位操作了。
欢迎和我讨论,转贴请注明出处,谢谢。
-------------------cofin_add