位字段的那些事儿

虽然在一般的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、只能在结构体中设置位字段,如果在函数中设置位字段,编译时将产生一条错误信息。


(完)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值