自定义类型——位段

什么是位段?

位段又叫做位域,具体是一种可以把数据以位的形式紧凑的存储,并允许程序员对此结构位进行操作的数据结构

当结构体的成员变量定义之后浪费了较大的空间

比如int a = 2,则浪费了30个比特位的空间)

这种情况就可以使用位段来规定变量所占字节来节省空间

位段的声明和结构是类似的,有两个不同:

1.位段的成员通常是 int、unsigned int 或signed int等整型家族的成员

2.位段的成员名后边有一个冒号和一个数字

比如:

struct A
{
    int _a:2;
    int _b:5;
    int _c:10;
    int _d:30;
};

A就是一个位段类型

这里表示,变量a只占2个比特位变量b表示占5个比特位变量c表示占10个比特位变量d表示占30个比特位


位段的内存分配

还是举上面的例子

struct A
{
    int _a:2;
    int _b:5;
    int _c:10;
    int _d:30;
};

位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的 

 对于这个例子而言,内存先开辟4个字节,存放a的2个比特位

存放b的5个比特位,存放c的10个比特位,此时开辟的4个字节的空间还剩下15个比特位

但是d需要30个比特位来存放,空间不足,所以还要另外开辟4个字节的空间来存放

可是会出现下面两种情况

新开辟后的空间,剩下的15个是否需要使用

对于这个问题,C语言没有给出明确标准

所以位段应该避免在注重移植的程序上使用

会出现下面两种情况

自定义类型——位段_第1张图片

 自定义类型——位段_第2张图片


位段的跨平台问题

1. int 位段被当成有符号数还是无符号数是不确定的

2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机 器会出问题

3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义

4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的

总结:

跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在

你可能感兴趣的:(C语言,c语言)