C语言自定义类型详解(2)位断、枚举、联合知识汇总

本篇概要

本篇主要讲述C语言位断、枚举。联合的相关知识,包括哥哥自定义类型的基本声明,使用、优点。计算等相关知识。

文章目录

  • 本篇概要
  • 1.位断
    • 1.1什么是位断?
    • 1.2 位段的内存分配
    • 1.3 位段的跨平台问题
    • 1.3 位段的应用
  • 2.枚举
    • 2.1 枚举类型的声明和定义
    • 2.2 枚举的优点
  • 3.联合(共用体)
    • 3.1 联合类型的声明和定义
    • 3.2 联合的特点
    • 3.3 利用联合体判断端脑是大端存储还是小端存储
    • 3.4 联合大小的计算


1.位断

相较于结构体,位断的出现就是为了节省空间。

1.1什么是位断?

位段的声明和结构是类似的,有两个不同:
1.位段的成员必须是 int、unsigned int 或signed int 。(现在也有char)
2.位段的成员名后边有一个冒号和一个数字。

例:

struct A
{
int _a:2;//_a占用2个bit位
int _b:5;//_b占用5个bit位
int _c:10;
int _d:30;
};

这里一共47个比特位,8*6=48,按理说这个位断应该占用6个字节。

在这里插入图片描述
可是却显示占8个字节,这是为什么?
不管它占用多少,如果是正常的结构体类型,4个整形应该占用16个字节,相比于正常的结构体,确实省内存。

1.2 位段的内存分配

  1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
  2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
  3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。
struct S
{char a : 3;char b : 4;char c : 5;char d : 4;
};int main()
{struct S s = { 0 };s.a = 10;s.b = 12;s.c = 3;s.d = 4;printf("%d", sizeof(struct S));
}

在这里插入图片描述
在这里插入图片描述

其内存分配方式如上图所示。

1.3 位段的跨平台问题

  1. int 位段被当成有符号数还是无符号数是不确定的。
  2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机 器会出问题。
  3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
  4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是 舍弃剩余的位还是利用,这是不确定的。

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

1.3 位段的应用

在这里插入图片描述

如上图所示结构,比如4位版本号,只占4个比特位,我们不使用位断,最小只能使用char类型1个字节,32个比特位,会浪费很多地方。那么第一行每个单位都需要一个char,总共需要4个字节。

如果使用位断的话,那么只需要1个字节,刚好可以把第一行的所有东西放下。即可以节省非常多的地方。

这就是位断的意义。

2.枚举

枚举顾名思义就是一一列举。把可能的取值一一列举。

2.1 枚举类型的声明和定义

enum为枚举的关键字。
例:

enum Sex//性别
{
MALE,
FEMALE,
SECRET
};enum Color//颜色
{
//枚举的可能取值
RED,//枚举常量
GREEN,
BLUE
};int main()
{//MALE = 5;//ERRprintf("%d\n", MALE);//0printf("%d\n", FEMALE);//1printf("%d\n", SECRET);//2enum Sex sex = SECRET;//也可以拿枚举取值给其赋值printf("%zd\n", sizeof(sex));//枚举变量所占内存空间大小是固定的数字,整形为4。return 0;
}

枚举输出默认顺序为0,1,2…这是固定的
在这里插入图片描述

这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值。
例:

enum Color//颜色
{
RED=1,
GREEN=2,
BLUE=4
};

2.2 枚举的优点

我们可以使用 #define 定义常量,为什么非要使用枚举?

枚举的优点:

  1. 增加代码的可读性和可维护性
  2. 和#define定义的标识符比较枚举有类型检查,更加严谨。
  3. 防止了命名污染(封装)
  4. 便于调试
  5. 使用方便,一次可以定义多个常量

3.联合(共用体)

联合也是一种特殊的自定义类型
这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。

3.1 联合类型的声明和定义

联合体的关键字是union

union Un
{char c;//1int i;//4
};int main()
{union Un un;printf("%d\n", sizeof(un));printf("%p\n", &un);printf("%p\n", &(un.c));printf("%p\n", &(un.i));return 0;
}

在这里插入图片描述
在这里插入图片描述
其公用空间,所以称为联合体
也即是上面我们所说的特征。

改c的同时也会改掉i,所以不能同时使用两个成员。

3.2 联合的特点

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。

3.3 利用联合体判断端脑是大端存储还是小端存储

如果你还不了解什么是大小端,可以看我之前的博客,此篇博客没有用联合体判断。
链接: link

int check_sys()
{union{char c;int i;}u;u.i = 1;return u.c;//返回1表示小端,返回0表示大端
}int main()
{int ret = check_sys();if (ret == 1)printf("小端\n");elseprintf("大端\n");return 0;
}

3.4 联合大小的计算

1.联合的大小至少是最大成员的大小。(联合体的大小就是最大成员的大小,这句话是错的)
2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

union Un
{char c[5];//5int i;//4
};int main() 
{printf("%zd\n", sizeof(union Un));return 0;
}

在这里插入图片描述

证明了第一点括号里的话是错的。
char c[5]的最大对齐数是1,int i的最大对齐数是4,所以最后是8.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/85631.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

互联网摸鱼日报(2023-09-22)

互联网摸鱼日报(2023-09-22) 36氪新闻 通过AI打造车联网地图,「Mapbox」获软银2.8亿美元E轮投资 消失的维密门店,以及背后的内衣暗战 白酒品牌频跨界:饮料就酒,越喝越有 张一鸣北美电商大冒险 拆解小程序短剧“一天进账1200万…

文件操作(2)

目录 文件操作的步骤: 流: 标准流: 文件指针: 文件信息区: 概念: 关系转化: 注意: 文件指针: 文件的打开和关闭: 打开方式: 打开成…

阿里云2核2G服务器e系列租用优惠价格182元性能测评

阿里云服务器经济型e实例2核2G配置优惠价格182.04元一年,系统盘ESSD Entry盘20GB起,公网带宽默认按使用流量,也可以选择按固定带宽计费,带宽值从1M到100M可选,阿腾云分享阿里云服务器2核2G优惠价格、详细配置及e系列CP…

计算机网络相关重点

目录 OSI七层模型与TCP/IP四层模型 TCP协议的3次握手过程 TCP协议3次握手的原因 TCP协议的四次挥手过程 流量控制 滑动窗口 拥塞控制 TCP和UDP的区别 OSI七层模型与TCP/IP四层模型 在网络的信息传输过程中,我们常常无法之间进行传输,而是需要…

(本地安装clickhouse)执行 nstall/doinst.sh时报错: cp: 无法创建普通文件“/usr/bin/clickho

问题描述 在本地安装clickhouse时, 解压:tar -zxvf clickhouse-common-static-21.9.4.35.tgz -C ../module/ 再进入cd clickhouse-common-static-21.9.4.35/ 执行:install/doinst.sh 报错 报错信息和截图: rootbigdata1 click…

CorelDraw是什么软件?好用吗

很多人都听过CorelDraw的名字,但不知道CorelDraw是什么样的软件。下面就让小编为大家详细介绍一下。 coreldraw是什么软件 CorelDraw是一款专业的图形设计软件。它的主要功能包括矢量图形和位图的编辑。用户可以利用其矢量图形编辑能力,设计各种图标、Logo等精细图…

数据结构与算法(C语言版)P2---线性表之顺序表

前景回顾 #mermaid-svg-sXTObkmwPR34tOT4 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-sXTObkmwPR34tOT4 .error-icon{fill:#552222;}#mermaid-svg-sXTObkmwPR34tOT4 .error-text{fill:#552222;stroke:#552222;}#…

C语言自定义类型详解(1)结构体知识汇总

本篇概要 本篇主要讲述C语言结构体的相关知识,包括结构体的基本声明,结构体的匿名结构,结构体的自引用,结构体变量的定义和初始化以及结构体的内存对齐等相关知识。 文章目录 本篇概要1.结构体1.1结构体的基本声明1.2结构体的特殊…

C# 查找迷宫路径

1.导入图像&#xff0c;并且将图像转灰度 using var img new Image<Bgr, byte>(_path); using var grayImg img.Convert<Gray, byte>(); 2.自动二值化图像 using var inputGrayOut new Image<Gray, byte>(grayImg.Size); // 计算OTSU阈值 var threshol…

C语言字符和字符串函数(2)

大家好&#xff0c;我今天继续来给大家分享C语言中的字符和字符串函数。 目录 ** 1.字符分类函数 2.memcpy 3.memmove 4.memcmp** 1.字符分类函数 islower判断字母小写函数 int main() {char ch w;if (islower(ch)){printf("小写\n");}else{printf("非小写\…

MQ - 26 基础功能:顺序消息和幂等的设计

文章目录 导图概述顺序消息的定义和实现消息队列的存储结构特性基于顺序存储结构的设计主流消息队列的实现机制幂等机制的定义和实现消息队列中幂等的定义生产幂等的设计实现1. 通过消息唯一 ID 实现幂等2. 通过生产者 ID 和自增序号实现幂等Kafka 的幂等机制的实现方案总结导图…

基于JAVA+SpringBoot+Vue+协同过滤算法+爬虫的前后端分离的租房系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着城市化进程的加快…

2023年研赛华为杯选题人数发布

选题人数发布&#xff01;经过长达30个小时&#xff0c;各个平台的相关选题投票、相关文章阅读量等各项数据进行统计&#xff0c;利用之前的评估办法&#xff08;详见注释&#xff09;。在开赛后30小时&#xff0c;我们基本确定各个赛题选题人数&#xff0c;大致为 题号选题人数…

BadTokenException: Unable to add window -- token null is not valid

windowManager.addView时报错 Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? 有可能是LayoutParams没有配置type或者type配置错误&#xff0c;可以试试layoutParams.typeWindowMa…

Mac 上如何安装Mysql? 如何配置 Mysql?以及如何开启并使用MySQL

前言&#xff1a; 有许多开发的小伙伴&#xff0c;使用的是mac&#xff0c;那么在mac上如何安装&#xff0c;配置Mysql&#xff0c;以及使用Mysql了&#xff0c;今天来一个系统的教程。 安装Mysql 使用mysql前&#xff0c;我们需要先下载mysql&#xff0c;并按照以下几个步骤…

Redis延迟双删-架构案例2021(三十二)

数据库设计 某医药销售企业因业务发展&#xff0c;需要建立线上药品销售系统&#xff0c;为用户提供便捷的互联网药品销售服务、该系统除了常规药品展示、订单、用户交流与反馈功能外&#xff0c;还需要提供当前热销产品排名、评价分类管理等功能。 通过对需求的分析&#xf…

python中使用多线程批量导入包

问题放到前面&#xff0c;目前发现一个问题&#xff0c;importlib对于c/c编译过来的包&#xff0c;只支持导入最顶层的包&#xff0c;不过也够了。 因为有些项目的依赖太多&#xff0c;所以导致每个文件头部都包含大量import语句&#xff0c;用来导入必要的包&#xff0c;如果量…

前端第二课,HTML,alt,title,width/heigh,border,<a>超链接,target,tr,td,th

目录 一、title: &#x1f49b; ​二、alt&#x1f499; 三、width/heigh&#x1f49c; 四、border ❤️ 五、超链接&#x1f49a; 六、target &#x1f497; 七、tr&#x1f495; 八、td&#x1f498; 九、th&#x1f49e; 十、rowspan 一、title: &#x1f49b; 快…

js-cookie使用 js深度克隆(判断引用类型是数组还是对象的方法)

cookie和深度拷贝的使用 1、js-cookie使用2、js深度克隆 1、js-cookie使用 前端的本地存储分为 localstorage、sesstionstorage、cookie 但是咱们有时候需要做7天免登录的需求时&#xff0c;选择 cookie 作为前端的本地存储是在合适不过的了 直接操作 cookie 可以&#xff0c; …

名义实际GDP-各地区-原始和结果(2000-2022年)

一、数据介绍 数据名称&#xff1a;名义、实际GDP-各地区-原始和结果 数据年份&#xff1a;2000-2022年 计算公式&#xff1a;实际GDP 名义GDP / GDP折算指数 数据基期&#xff1a;2000年 数据整理&#xff1a;自主整理 二、数据用途 数据用途 文献依据 经济发展水平 …