联合体(共用体)的简单介绍

news2024/12/27 11:05:47

目录

概念:

联合的声明:

类比结构体:

联合体的大小:

联合的⼤⼩⾄少是最⼤成员的⼤⼩

 联合体的空间是共用的

联合体内部成员的赋值:

当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。 

利用联合体,判断当前机器是⼤端?还是⼩端?

什么是大端小端:

简单介绍一下:

代码演示:



概念:

联合也是一种特殊的自定义类型。

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

联合的声明:

union un
{
 int a;
 char c;
}u;
  • union是联合的关键字,不可更改。
  • un 是联合的标签,相当于联合的名字,可以更改。
  • {}花括号内部的是联合体的成员,和结构体一样,是一个不同类型数据的集合。
  • u表示的是该联合类型创造的变量。

类比结构体:

  • 联合体类比与结构体,或者说各方各面都和结构体类似,但是有一点不同。
  • 如果将结构体比作一栋楼,那么这栋楼内有很多层住户,每一个住户都有各自的独立的空间。
  • 而相比于结构体,联合体更像是一个出租屋,里面有好几位租客,它们很多的生活空间都是共用的。

 

联合体的大小:

联合的⼤⼩⾄少是最⼤成员的⼤⼩

union un
{
 int a;
 char c;
}u;

int main()
{
  int ret = sizeof(u);
  printf("%d\n",ret);
  return 0;
}

从以上代码来看,int 类型的a占据了四个字节,而char 类型的c占据一个字节,那么理论上,联合体占据的总字节,应该是5个字节。

但是答案是这样吗?

 

并不是,这其实原理来自于联合体的特点之一:联合的⼤⼩⾄少是最⼤成员的⼤⼩。 

如上文说过,联合体好比一个出租屋,很多的生活空间都是共用的。

所以,联合体是开辟了一块大空间,让内部的成员一起使用。

 

 联合体的空间是共用的

又比如:

union un
{
 int a;
 char c;
}u;

int main()
{
  printf("%p\n",&u);
  printf("%p\n",&(u.a));
  printf("%p\n",&(u.c));
  return 0;
}

最终的答案是:

 

 这样能够证明联合体的空间是共用的。

联合体内部成员的赋值:

  • 上文讲诉了联合体的空间内部就像合租一样,是共用空间的。
  •  所以当赋予一个联合体成员数值的时候,其他的联合体成员是会被该成员的数值覆盖。

例如:

union un
{
 int a;
 char c;
}u;

int main
{
  union Un u;
  u.a = 0x11223344;
  u.c = 0x00;
  return 0;
}
  • 我们先后对成员a和成员c进行赋值。
  • 按照之前的说法,给成员c赋值,那么成员c所在的空间中的成员a的数值就会被c的数据覆盖,或者给成员a赋值,那么成员c所在空间的数据就会被a覆盖。

进行调试:

这是对int 类型的成员a进行赋值后。

随后又对char类型的成员c进行了赋值。

得到的结论如以上说法一致。,这种覆盖赋值的模式类似与共享单车。

 

当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。 

union un
{
 char arr[5];
 int i;
}u;

int main()
{
  printf("%d\n",sizeof(union un));
  return 0;
}

以上代码是求联合体的字节数,按照之前的说法 “ 联合的⼤⼩⾄少是最⼤成员的⼤⼩。”

char arr[5]的字节大小是5,而int i 的字节大小是4,那么联合体大小一定是最大的成员的大小,也就是char arr[5]的大小,5个字节。

答案真是如此吗?

 

错误,这里涉及到了联合体成员内存对齐的原理。

 char arr[5]相当于写了五个char,所以最大其实是int, 但是空间不够啊,所以应该用对齐解决,而int的默认对齐数是8 所以最大字节数是8。

又列如:

union un
{
 short arr[7];
 int i;
}u;

int main()
{
  printf("%d\n",sizeof(union un));
  return 0;
}

short arr[7]占据的是14个字节,int i占据的是4个字节,而这里求除的联合体大小是16个字节,是最大类型 int 的字节数的4倍。

 

利用联合体,判断当前机器是⼤端?还是⼩端?

什么是大端小端:

大端小端是内存存储数据的方法,而内存存储数据一般是二进制数位进行存储,所以这里便有了区分。

简单介绍一下:

int i = 1 
  • 1的十六进制数位:0x 00 00 00 01  
  • 去除前缀0x,十六进制数位从低到高是 01 00 00 00 这就是小端
  • 而十六进制数位从高到低 00 00 00 01 这就是大端。

而判断机器的是大端还是小端,则是判断这十六进制数位的最前端的字节到底是00还是01,如果是00那么是大端,如果是01那么是小端。(这里使用整型数字1的十六进制数位进行判断)

而在此时便可以利用联合体的特点。

代码演示:

int check_sys()
{
 union
 {
 int i;
 char c;
 }un;
 un.i = 1;
 return un.c;
}

通过提取出 int 类型的成员i 并进行赋值,而后返回char类型的成员c进行读取,因为联合体的特点,这两个成员都处在一个空间,成员c是char类型,并没有进行赋值,所以再返回后,读取的其实是int类型的成员i的数据,也是int类型成员i的最前端的空间数据。

也就是可以使用以上代码,读取整型数字1再该编译器中,使用的是大端还是小端。 

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

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

相关文章

性能测试工具Jmeter你所不知道的东西····

谈到性能测试,大家一定会联想到Jmeter和LoadRunner,这两款工具目前在国内使用的相当广泛,主要原因是Jmeter是开源免费,LoadRunner 11在现网中存在破解版本。商用型性能测试工具对于中小型企业很难承担相关的费用。国内的性能测试工具有&#…

Java项目-苍穹外卖-Day08

文章目录 前言导入地址簿代码导入需求分析代码导入功能测试 用户下单需求分析接口设计数据库设计 代码开发功能测试 前言 本篇博客主要是用户端的功能完善 主要是三个功能 1.导入地址簿 2.点击去结算弹出结算页面 3.微信支付功能 导入地址簿代码导入 这个地址簿就是一个表的…

视频监控系统

一、音视频推流框架概述 1.什么是推流 转载:原文链接:【知识拓展】音视频中的推流与拉流_推流拉流_No8g攻城狮的博客-CSDN博客 推流:把采集阶段封包好的内容传输到服务器的过程。其实就是将现场的视频信号传到网络的过程。“推流”对网络要…

Java学习笔记之----I/O(输入/输出)一

在变量、数组和对象中存储的数据是暂时存在的,程序结束后它们就会丢失。想要永久地存储程序创建的数据,就需要将其保存在磁盘文件中(就是保存在电脑的C盘或D盘中),而只有数据存储起来才可以在其他程序中使用它们。Java的I/O技术可…

STS4 New 安装Spring Bean Configuration File

背景介绍 在创建spring项目后,如果想想创建spring bean Configuration的时候,发下菜单没有这个选项,需要通过下载Spring Roo插件可满足该操作。 参考案例 参考地址: STS4 New 菜单没有Spring Bean Configuration File选项_SQZHA…

02-Windows Server搭建AD服务

1、安装AD 等待安装 2、配置 等待安装(10分钟)完后自动重启 3、安装成功

javaee之黑马乐优商城2

简单分析一下商品分类表的结构 先来说一下分类表与品牌表之间的关系 再来说一下分类表和品牌表与商品表之间的关系 面我们要开始就要创建sql语句了嘛,这里我们分析一下字段 用到的数据库是heima->tb_category这个表 现在去数据库里面创建好这张表 下面我们再去编…

批量文件重命名,轻松在文件夹中插入相同文字符号!

你是否曾经需要批量修改文件夹中的文件名,或者需要在文件名中插入特定的文字符号?现在,我们为你提供了一种快速、简单的方法,让你轻松实现这一需求! 首先第一步,我们要打开文件批量重命名高手,…

微信小程序 选择学期控件 自定义datePicker组件 不复杂

我的时间选择组件在common文件夹里 datePicker组件代码 html: <view class"date_bg_view"> </view> <view class"date_content"><view class"date_title"><image src"/image/icon_close_black.png" clas…

SKU助手

属性SKU助手可以帮你快速选中目标商品属性 下载安装与运行 下载、安装与运行 语雀 如何使用 下面以1688批量自动下单为例&#xff0c;演示用法&#xff0c;同样适用于淘宝天猫拼多多批量自动下单 功能说明 SKU助手弹出的时机 同时满足如下两个条件 Excel提供的SKU与真实…

知识储备--基础算法篇-数组

1.学习 2.数组 2.1第53题-最大子数组和 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 心得&#xff1a;一直在纠结这个连续的事情&…

YOLOv5算法改进(13)— 替换主干网络之PP-LCNet

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。PP-LCNet是一个由百度团队针对Intel-CPU端加速而设计的轻量高性能网络。它是一种基于MKLDNN加速策略的轻量级卷积神经网络&#xff0c;适用于多任务&#xff0c;并具有提高模型准确率的方法。与之前预测速度相近的模型相比…

你真的懂分数吗?(二)——分数模型应用初探

早点关注我&#xff0c;精彩不错过&#xff01; 上回我们聊到了分数的数学结构和数学建模&#xff0c;构成了分数的基本数学模型。相关内容请戳&#xff1a; 你真的懂分数吗&#xff1f;&#xff08;一&#xff09;——分数的数学结构和建模 但是&#xff0c;这样的分数是定义在…

基于单片机的点阵电子显示屏上下左右移加减速系统

一、系统方案 本设计的任务就是完成一个1616的点阵设计&#xff0c;并能滚动显示“********************”内容。 主要内容是&#xff0c;能同时流动显示汉字&#xff1b;能实现显示汉字无闪烁&#xff1b;能实屏幕亮度较高。本LED显示屏能够以动态扫描的方式显示一个1616点阵汉…

性能可靠it监控系统,性能监控软件的获得来源有哪些

性能可靠的IT监控系统是企业IT运维的重要保障之一。以下是一个性能可靠的IT监控系统应该具备的特点&#xff1a; 高可用性 高可用性是IT监控系统的一个重要特点&#xff0c;它可以保证系统在24小时不间断监控的同时&#xff0c;保证系统服务的可用性和稳定性。为了实现高可用性…

TiDB x 安能物流丨打造一栈式物流数据平台

作者&#xff1a;李家林 安能物流数据库团队负责人 本文以安能物流作为案例&#xff0c;探讨了在数字化转型中&#xff0c;企业如何利用 TiDB 分布式数据库来应对复杂的业务需求和挑战。 安能物流作为中国领先的综合型物流集团&#xff0c;需要应对大规模的业务流程&#xff…

linux中dmesg命令用法

在Linux系统中&#xff0c;dmesg&#xff08;diagnostic message&#xff09;是一个非常有用的命令行工具&#xff0c;用于显示和控制内核环形缓冲区中的消息。这些消息通常包含系统启动时的内核生成的信息&#xff0c;例如硬件设备的状态&#xff0c;驱动程序的加载&#xff0…

【Python基础教程】快速找到多个字典中的公共键(key)的方法

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 方法一&#xff1a;for in循环 from random import randint, samplea1 {k: randint(1, 4) for k in abcdefg} a2 {k: randint(1, 4) for k in abc123456…

Qt应用开发(基础篇)——输入对话框 QInputDialog

一、前言 QInputDialog类继承于QDialog&#xff0c;是一个简单方便的对话框&#xff0c;用于从用户获取单个值。 对话框窗口 QDialog QInputDialog输入对话框带有一个文本标签、一个输入框和标准按钮。输入内容可以字符、数字和选项&#xff0c;文本标签用来告诉用户应该要输入…

一文看遍半监督学习模型(Semi-Supervised Learning)

一、半监督学习的总体框架 二、一致性正则化模型 该算法旨在&#xff1a;一个模型对于同一个未标记图像&#xff0c;在图像添加额外噪声前后的预测值应该保持一致。 添加噪声的方法&#xff0c;如图像增强&#xff08;空间维度增强、像素维度增强&#xff09;。 同样&#x…