IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言之位段结构体(联合体) -> 正文阅读

[C++知识库]C语言之位段结构体(联合体)

1.什么是位段?

位段中的位指的是二级制位,故位段结构体指的是以二进制位位单位创建的结构体,他是一种结构体类型,同时联合体也同样适用。而位段的使用范围只有(int,unsigned int ,signed int),其中char也属于特殊的整型,故同样适用。

2.位段的意义

节省空间,结构体成员中以类型定义(char,int,long,double...),但是如果已知所设定的整型的范围,比如星期week(1-7)那么就可定义的范围4个比特位。一定程度上节省空间。

3.位段的使用方法

1.位段的成员可以是 int ,unsigned int, signed int, 以及char(属于整型家族)。

2.位段的空间是由需要按照int(4个字节)以及char(1个字节)的来开辟的。

3.位段有很多不确定因素,位段是不跨平台的,注重对可移植的程序应该避免使用位段。

//举个例子
struct s
{
    int a:2;
    int b:3;
    int c:30;
}stu;

注意:

若你所分配的内存不够存放你所要存储的数据时就会发生截断。如stu.a = 10;? ?a为2 bit? ? ? ? ? 实际上10的二进制位为1010,故只能存放低位数的两位即10,故stu.a ==2;

同时位段成员内存的分配也不能超出自身的大小,如32位的设备int为32bit(4个字节),那么最多分配32 bit的大小。

4.位段在内存中的存储形式以及其大小的计算

不同设备和编译器下的位段大小和存储形式是不同的,这是其不能跨平台的原因。

以VS编译器下的char为例:(空间按需求每次开辟int 或char 个字节的空间)

结果1:总大小为3byte

int main()
{
  struct s
  {
    //开辟一个char(8bit)
    char a:3;        //8-3 ==5
    char b:4;        //5-4 ==1

    //剩1 bit不够,开辟第二个char(8bit)
    char c:5;        //8-5=3

    //剩3 bit不够,开辟第三个char(8bit)
    char d:4;        //故总大小为3 byte
   };
   printf("%d\n",sizeof(struct s));
   return 0;
 }

结果2:总大小为2 byte

int main()
{
  struct s
  {
    //开辟一个char(8bit)
    char a:3;        //8-3 ==5
    char b:4;        //5-4 ==1

    //剩1 bit不够,开辟第二个char(8bit)
    char c:5;        //8+1-5=4

    //剩4 bit够,不用开辟,故总大小为2byte
    char d:4;        //4-4 ==0
   };
   printf("%d\n",sizeof(struct s));
   return 0;
 }

在vs编译器地下的位段是由第一种计算方法分配内存的。

具体分配如下

?

?由图可以看出来,VS编译器是会舍弃多余的空间,新开辟空间存放新数据,是由该字节的低位——>高位存放。(此处无关字节序,字节之间才和大小端字节序有关)。也可看出当分配空间不够而数据过大的情况会发生截断,如a:3存放10(即01010)时截断。

5.位段的跨平台问题

1.int位段被当作有符号还是无符号是不确定的;
2.位段中最大位的数目是不确定的(16位的机器最大为16,32位的为32,若写成17则在16位机器下会出现问题);
3.位段中的成员在内存中是从左向右分配,还是从右向左的标准尚未定义;
4.当发生上图空白格子的情况,是舍弃还是利用还不确定。
总结:与结构体相比,位段可以很大程度的节省空间(但并不代表一点都不消耗,看上图例子),但其跨平台问题依然存在。使用位段时我们首先要知道数据所占最大的空间才能准确使用其内存大小。

以上是本章的全部内容,均是本人的一些浅薄见解

自己深知自我的知识储备还比较有限

如有理解不恰当之处,望各位指正

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-06 13:38:43  更:2022-02-06 13:39:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:30:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码