位段(详解)

位段又称为位域。C语言中没有专门的位段类型,位段的定义要借助于结构体,即以二进制位为单位定义结构体成员所占存储空间。从而就可以按“位”来访问结构体中的成员,这一功能是很有用的。某些设备接口之间传输信息是以字节为单位的,字节中的不同位代表不同的控制信号,使用中常常需要单独置值或清零。又如C语言中没有逻辑量,是用0代表“假”,非0代表“真”。实际只需一个二进制位就可存储。利用位段就可以在一个字节中存放几个逻辑量。

位段结构体成员声明的一般形式如下:

数据类型 成员名 : 整数

其中,“数据类型”只能是 unsigned、shor、unsigned 或 int 型,“整数”指出位段的长度。
例如,以下语句声明了一个位段结构体:

struct packed_data /*packed_ data 为位段结构体类型名*/
{
	unsigned a:1;
	unsigned b:2;
	unsigned C:3;
}

其中,a、b、 c分别占1位、2位和3位,共同存储在1个字节(8位)中。

我们知道结构体各成员在内存中是按照最长字节成员的长度对齐的,而位段数据在内存中是按照系统机器字长对齐的。

(对齐位长,与系统机器字长有关,又由编译器决定)
如在32位和64位系统中,
Turbo C中按照24位即3字节对齐。
VC中位段按照32位即4字节对齐。

32位系统和64位系统的对齐一致性,便于两个不同系统之间的交互,增强兼容性;使用32位较小的对齐位长,能有效节省数据处理时的空间消耗。

位段的定义遵守以下规定:

位段长度:1~其本身类型的最大位长。

●不允许位段跨越一个字的边界,如果一个字余下的空间不能容纳一个位段,则这个位段从相邻的下一个字的边界开始存放。由此在上一个字中留下未用的空位,称为空穴。(16位系统一个字是2个字节,32位系统一个字是4个字节,64位系统是8个字节。)

●位段可以没有名字,无名位段表示该空间不用。

●位段只能作为结构体成员,不能作共用体的成员。

●位段没有地址,对位段不能进行取地址的“&”运算。

●位段的长度不能大于机器字长度,也不能定义位段数组。

●位段可以用整型格式符输出。

●位段可以在数值表达式中引用,它会被系统自动转换成int型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Whitemeen太白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值