位段

在C语言中,我们可以利用结构体实现位段的功能。位段的声明和结构类似,但是它的成员是一个或者多个位的字段。这些不同长度的字段实际上存储在一个或者多个整型变量中。
位段的声明和任何普通的结构成员声明相同,但有两个例外:第一、位段成员必须声明为int、signed int、unsigned int类型。第二、在成员名的后面是一个冒号和一个整数,这个整数用于指定该位段所占用的位的数目。例如下面是一个位段声明的例子:

struct CHAR{
	unsigned ch : 7;
	unsigned font : 6;
	unsigned size : 19;
};

许多16位整数机器的编译器会把这个声明标识为非法,因为最后一个位段的长度超过了整型的长度。但是在32位的机器上,则可能有两种情况。
在这里插入图片描述

需要注意的是,注重可移植性的程序应该避免使用位段。原因如下:

  • int位段被当作有符号数还是无符号数
  • 位段中位的最大数目,许多编译器把位段成员的长度限制在一个整数值的长度之内,所以一个可以运行在32位整数的机器上的位段声明可能在16位整数对的机器上无法运行。
  • 位段中的成员在内存中是从左往右分配还是从右往左分配的。
  • 当一个声明指定了两个位段,第2个位段比较大,无法容纳于第一个位段剩余的位时,编译器有可能把第2个位段放在内存的下一个字,也可能直接放在第一个位段的后面,从而在两个内存位置的边界上形成重叠。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值