虽然在一般的PC编程中主要使用基本类型。但是如果涉及到嵌入式开发编程,位字段能够更好地节省存储空间,并且设置方便。
关于位字段的一些特点与注意事项本文使用以下代码作为实例:
#include <stdio.h>
typedef struct
{
int show:1,
color:3,
volume:4,
type:8,
size:24;
} BitStruct_1;
typedef struct
{
int show:1;
int color:3;
int volume:4;
int :8;
int type:8;
} BitStruct_2;
int main()
{
BitStruct_1 bs_1 = {1,5,10,234};
BitStruct_2 bs_2;
bs_2.show = 5; // 溢出
bs_2.color = 6;
bs_2.volume = 9;
bs_2.type = 157;
printf("sizeof bs_1:%d\n", sizeof(bs_1));
printf("sizeof bs_2:%d\n", sizeof(bs_2));
printf("%d\n", bs_2.show);
return 0;
}
GCC编译结果如下
jimmy@MyPet:~/code/learnc$ make
gcc -Wall -g -o test test.c -std=c99 -lpthread
test.c: In function ‘main’:
test.c:26:2: warning: overflow in implicit constant conversion [-Woverflow]
jimmy@MyPet:~/code/learnc$ ./test
sizeof bs_1:8
sizeof bs_2:4
-1
jimmy@MyPet:~/code/learnc$
从以上的代码和结果关于位字段的使用总结以下几点:
1、在进行位字段定义的时候,两种BitStruct_1和BitStruct_2两种形式都可以。注意到bs_1占8个字节,只写一个int并不代表强制将所有位存储在一个字段,编译时并不报错或警告,自动将多出的字段放到下一个int区。
2、位字段的初始化和一般结构体的初始化没有区别。也可以采用单个赋值的方式。
3、位字段的格式化输出采用基本类型的类型限定符即可。
4、位字段的赋值一定要注意溢出的问题。上面的例子在bs_2.show故意设置了溢出值,我们发现,溢出后的位字段在这个例子中始终被设置为-1。
5、只能在结构体中设置位字段,如果在函数中设置位字段,编译时将产生一条错误信息。
(完)