结构体中的位段

一.什么是位段

在结构体中以二进制为单位指定成大小的方式,称为:位段或位域。

二.存在原因

有时数据的存储用不了一个或多个字节,如表示真假时,只需要一个比特位即可。
本质还是为了节省空间

三.使用方法

注意:位段不跨平台
1.位段的成员必须为unsigned(无符号)或int,char类型;
2.位段的成员名后边有一个冒号和一个数字(这个数字为所占比特位大小)
3.位段按照一次4个字节(int)或者1个字节(char)来开辟空间
使用时应注意:
若你所分配的内存不够存放你所要存储的数据时就会发生截断。
eg:

#include<stdio.h>
int main()
{
 struct s
 {
   char a:3;
   char b:4;
 };
 struct s ret={0};
 ret.a=10;
 printf("%d\n",ret.a);//输出为:2
 system("pause");
 return 0;
 }

原因:10的二进制为:1010,二a变量只有3个比特位,因此发生截断。
从左向右只取了010这三位,因此输出为2。

四.在内存中存储的形式以及计算大小的方法

在VS平台下以char为例:
一次开辟一个字节(也就是8个比特位),若元素大小<8,则继续放,直到放至某个元素处超过了这8个比特位,则重新开辟一个字节来存储这个元素。以此类推,直至全部存储完毕。
eg:

#include<stdio.h>
int main()
{
  struct s
  {
    char a:3;//a占3个比特位的大小,以下同理
    char b:4;
    char c:5;
    char d:4;
   };
   printf("%d\n",sizeof(struct s));//输出为:3
   system("pause");
   return 0;
 }

其排布规则如下图所示:

计算大小时可以这样理解:其中空白的格子为浪费掉的空间;方格中的位表示的是比特位。

五.位段跨平台问题

1.int位段被当作有符号还是无符号是不确定的;
2.位段中最大位的数目是不确定的(16位的机器最大为16,32位的为32,若写成17则在16位机器下会出现问题);
3.位段中的成员在内存中是从左向右分配,还是从右向左的标准尚未定义;
4.当发生上图空白格子的情况,是舍弃还是利用还不确定。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值