[C][自定义类型][二][位段][枚举][联合体]详细讲解

news2024/12/29 16:16:40

目录

  • 1.位段
    • 1.什么是位段?
    • 2.位段的内存分配
    • 3.位段的跨平台问题
    • 4.位段的应用
  • 2.枚举
    • 1.什么是枚举?
    • 2.枚举类型的定义
    • 3.枚举的优点
    • 4.枚举的使用
  • 3.联合体(共用体)
    • 1.联合类型的定义


1.位段

1.什么是位段?

  • 位段的声明和结构是类似的,但有两个不同
    • 位段的成员必须是intunsigned intsigned int
    • 位段的成员名后边有一个冒号和一个数字(指占几个bit位)
      struct A
      {
          int _a:3;
          int _b:4;
          int _c:5;
          int _d:4;
      };
      

2.位段的内存分配

  • 位段的成员可以是intunsigned intsigned intchar(属于整形家族)
  • 位段的空间按照需要,以4个字节(int)或者1个字节(char)的方式来开辟的
  • 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段
  • 当十进制转化为二进制时,超出的部分会被截断
    请添加图片描述

3.位段的跨平台问题

  • int位段被当成有符号数还是无符号数是不确定的
  • 位段中最大位的数目不能确定
    • 16位机器最大16,32位机器最大32,写成27,在16位机器会出问题
  • 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义
  • 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的
  • 总结:跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在

4.位段的应用

  • 例如:UDP、TCP报头等
    请添加图片描述

2.枚举

1.什么是枚举?

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

2.枚举类型的定义

enum Color
{
    RED,
    GREEN,
    BLUE
};
  • 以上定义的enum Color是枚举类型
  • {}中的内容是枚举类型的可能取值,也叫枚举常量
  • 这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值
    enum Color
    {
        RED=1,
        GREEN=2,
        BLUE=4
    };
    

3.枚举的优点

  • 可以使用#define定义常量,为什么非要使用枚举?
    • 增加代码的可读性和可维护性
    • #define定义的标识符相比,枚举有类型检查,更加严谨
    • 防止了命名污染(封装)
    • 便于调试
    • 使用方便,一次可以定义多个常量
  • 总结:能用枚举就用枚举,不用define 没办法再用define
  • 可读性和可维护性举例
    void Menu()
    {
    	printf("*********************************\n");
    	printf("****   1. Add       2. Sub   ****\n");
    	printf("****   3. Mul       4. Div   ****\n");
    	printf("****   0. Exit               ****\n");
    	printf("*********************************\n");
    }
    
    enum Option
    {
    	EXIT, // 0
    	ADD,  // 1
    	SUB,  // 2
    	MUL,  // 3
    	DIV   // 4
    };
    
    void main()
    {
    	int input = 0;
    	do
    	{
    		Menu();
    		Printf("请选择:>");
    		scanf("%d", &input);
    		switch(input)
    		{
    		case ADD:
    			// ...
    		case SUB:
    			// ...
    		case MUL:
    		// ...
    		case DIV:
    		// ...
    		case EXIT:
    		// ...
    		default:
    		// ...
    		}
    	}while(input);
    }
    

4.枚举的使用

enum Color//颜色
{
    RED=1,
    GREEN=2,
    BLUE=4
};
enum Color clr = GREEN; // 只能拿枚举常量给枚举变量赋值,才不会出现类型的差异
clr = 5;                // error,clr为num常量,赋初值后不可改变

3.联合体(共用体)

1.联合类型的定义

  • 联合也是一种特殊的自定义类型
  • 这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间
    • 所以联合也叫共用体
    • 联合体内,所有成员的起始地址都是一样的
  • 联合体也可以使用. ->访问
  • 例如:所占空间为4byte
	// 联合类型的声明
	union Un
	{
	    char c;
	    int i;
	};
	// 联合变量的定义
	union Un un;
	```
## 2.联合的特点 && 计算

- 联合的成员是共用同一块内存空间的
- **联合体的大小至少是最大成员的大小**
	- 因为联合体至少得有能力保存最大的那个成员
- 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍

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

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

相关文章

振弦采集仪在岩土工程地质灾害监测中的可行性研究

振弦采集仪在岩土工程地质灾害监测中的可行性研究 引言: 岩土工程地质灾害是指在岩土体中由于自然力和人类活动等因素引起的,对人类生活、财产以及环境造成威胁的灾害。为了及时发现并准确监测地质灾害的发生和演化过程,振弦采集仪作为一种新…

24年gdcpc省赛C题

1279:DFS 序 先不考虑多节点,先看着颗二叉树,假设他们的父亲节点是第k个被访问的点,如果先访问左子树,那么得到的结果是a1*ka2*(k1)b1*(2k)b2*(2k1),可以发现,先访问左子树,那么右子树每次的乘以的p值实际上是左子树乘以的p值加上左子树的节点个数,比如a1*k和b1*(2k),如果不看2…

Ethr:一款TCP、UDP和HTTP网络性能测量工具

Ethr Ethr是一个用golang编写的跨平台网络性能测量工具。该项目的目标是提供本机工具,用于跨多种协议(如TCP,UDP,HTTP,HTTPS和跨多个平台)对带宽,连接,数据包,延迟&…

软件测试经理工作日常随记【6】-利用python连接禅道数据库并自动统计bug数据到钉钉群

测试管理_利用python连接禅道数据库并统计bug数据到钉钉 这篇不多赘述,直接上代码文件。 另文章基础参考博文:参考博文 加以我自己的需求优化而成。 统计的前提 以下代码统计的前提是禅道的提bug流程应规范化 bug未解决不删除bug未关闭不删除 db_…

解锁 AI 潜力:香橙派 AIpro 评测与实操指南

解锁 AI 潜力:香橙派 AIpro 评测与实操指南 引言 在智能科技飞速发展的今天,AI 技术正逐渐改变我们的生活方式。作为开发者,找到一款高性能、易用且经济实惠的开发板至关重要。香橙派 AIpro(OrangePi AIpro)凭借其卓越…

云下到云上,丽迅物流如何实现数据库降本50% | OceanBase案例

在2024年3月20日的首场OceanBase数据库城市行活动中,专注于物流及供应链解决方案的丽迅物流的架构师阳磊,围绕“OB Cloud在丽迅物流的实践”这一主题,进行了精彩的演讲。本文为此次演讲的内容回顾。 在丽迅物流(Lesoon Logistics…

triton之paged attention

一 原理 图解大模型计算加速系列之:vLLM核心技术PagedAttention原理 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/691038809 二 源码分析 1 测试参数设置 test_paged_attention(num_seqs32,num_heads(64, 64),head_size64,block_size16,dtypetorch.float16,…

java的变量关系~使用和扩展

一、变量的概述 1、什么是变量 白话:变量就是一个装东西的盒子。 通俗:变量是用于存放数据的容器。我们通过变量名 获取数据,甚至数据可以修改。 2、变量在内存中的存储 本质:变量是程序在内存中申请的一块用来存放数据的空间,类似我们酒店的房间&a…

[数据集][目标检测]喝水检测数据集VOC+YOLO格式995张3类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):995 标注数量(xml文件个数):995 标注数量(txt文件个数):995 标注类别…

抖音本地生活服务商入驻指南分享!

当前,各大平台的团购外卖业务持续火爆,并逐渐成为众多创业赛道中的大热门。其中,本地生活服务更是在短时间内杀出重围,成为创业者们的首选。 根据抖音生活服务近日发布的《2023年度数据报告》,2023年,抖音生…

谷歌地图 | Google I/O ‘24 重磅发布助力企业拓展海外市场的新功能!

编者按:本文是 Google I/O 2024 系列的一部分,该系列分享了Google 年度开发者大会上最新的 Google Maps Platform 新闻。 距全球首个 Google Maps API 问世已近 20 年。它引领了网络和移动端地理空间体验的革命。从那时起,Google Maps Platf…

Postgresql源码(132)分布式行锁的原理分析

相关 《Postgresql源码(131)行锁的原理分析》 1 分布式行锁 PG中的行锁在上一片中做了分析《Postgresql源码(131)行锁的原理分析》,本篇对分布式PG(PGXL)中的行锁做一些分析。(版本…

CDGA|像治理空气和水一样来治理数据:构建数字时代的新秩序

在数字时代,数据已经渗透到我们生活的方方面面,成为推动社会发展的重要引擎。然而,随着数据的爆炸式增长,如何有效治理数据,确保其安全、可靠和合规,成为摆在我们面前的一大挑战。为了应对这一挑战&#xf…

期望薪资26K,北京疯狂游戏golang一面

北京疯狂游戏一面 1、自我介绍 2、财务业务中,你做了哪些设计来保证金额数据的准确性?(例如,业务涉及多步骤,某一步出了问题怎么解决) 3、如何解决单个业务直接报错的数据准确性问题 4、分布式场景下&a…

Springboot事务控制中A方法调用B方法@Transactional生效与不生效情况实战总结

介绍 本篇对Springboot事务控制中A方法调用B方法Transactional生效与不生效情况进行实战总结,让容易忘记或者困扰初学者甚至老鸟的开发者,只需要看这一篇文章即可立马找到解决方案,这就是干货的价值。喜欢的朋友别忘记来个一键三连哈&#x…

如何简化不同网间文件摆渡的操作流程,降低IT人员工作量?

为了保护内部核心数据不被泄露,同时有效屏蔽外部网络攻击的风险,企业大多会选择实施网络隔离。将“自己人”与“外人”隔离,具有较强的安全敏感性。有些企业还会在内部网络中进一步划分,比如划分为研发网、办公网、生产网等&#…

【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)

前言 文章性质:学习笔记 📖 学习资料:吴茂贵《 Python 深度学习基于 PyTorch ( 第 2 版 ) 》【ISBN】978-7-111-71880-2 主要内容:根据学习资料撰写的学习笔记,该篇主要介绍了优化候选框的几种方法。 一、优化候选框的…

Java 面向对象编程(OOP)

面向对象编程(Object-Oriented Programming,OOP)是Java编程语言的核心思想之一。通过OOP,Java提供了一种结构化的编程方式,使代码更易于维护和扩展。 一、类和对象 1. 类的定义 类是对象的蓝图或模板,定…

回收站删掉的照片还能找回来吗?掌握这5个方法,很简单!

“我一不小心在回收站中误删了一些照片,这些照片对我来说是比较重要的,不知道这些还有机会将它们找回来吗?” 当我们不小心将珍贵的照片从计算机的回收站中误删时,那种瞬间的心痛和焦虑难以言表。这些照片可能记录了我们生活中的重…