c语言联合有什么作用,C语言union共用体(联合体)基础知识及实际用途
union我想应该不是为了省内存而创建的吧!能省多少内存呢?
我猜测是:一个空间可以同时使用多种类型,而不必在意数据类型,因为我们可以通过里面的数值判断数据类型.(可参考动态语言Lua/Python)
C语言中的数据类型存储规则是较为严格的,即一块内存空间只能存储一种数据类型。
但是,在早期性能低下的计算机中,内存就像是金矿一样稀有。
程序的编译和运行,无不必须使用内存,所以为了节约内存空间,达到在同一块内存空间中储存不同类型数据的目的,共用体应运而生。
我们可以使用共用体,将多种不同类型的变量存放到同一段内存单元,也就是说,某几种数据类型共同覆盖同一块内存空间,共用体的定义方式与结构体非常类似,使用union加共用体名,即可完成定义。
比如这样:就定义了一个名为person的共用体。其中包括两个成员,一个是char类型的name,另一个是int类型的age。
在某种意义上,共用体(union)是类似结构体(struct)的一种数据结构,它们一样可以包含很多种数据类型,但两者有本质上的不同。
从内存角度来讲,在结构体中,各成员有各自的内存空间,即不管结构体中的成员变量是否会被使用,C程序都会给它分配内存,所以一个结构体变量的总长度大于或等于各成员长度之和。
而在共用体中,各成员共享同一段内存空间,一个共用体变量的长度等于其各成员中最宽数据类型的长度。
比如某个共用体中包含了两个成员,一个是int类型,另一个是double类型,此时,该共用体变量的长度就是8字节,也就是double类型成员的长度。
应该说明的是,这里所谓的共享不是指把多个成员同时装入一个共用体变量内,而是指该共用体变量可被赋予任意一种数据类型的值,但是每次只能赋一种值。若赋入新值,则会覆盖掉旧值。
比如:李华创建了一个名为Tom的person类型共用体变量,在给其中的成员name赋值之后,又给age赋了值,此时Tom中保存的只有大小为4字节的age的值,而丢失了单字节的name的值。
也就是说,共用体中只包含最后一个被赋值的成员,即,共用体在同一时间只能存放一个变量,相信聪明的你现在已经了解共用体的原理。
这里我需要引申一点,在实际编程开发中,为了确定当前计算机使用的存储模式,是大端存储还是小端存储,使用共用体来进行判断,是一个简单而又高效和方法。
计算机系统中的内存是以字节为单位划分的,每个地址单元对应着一个字节,一个字节大小为8bit,可以存放一个八位的二进制数,比如10101010,但是在C语言中除了8bit的char类型之外,还有16bit的short类型,32位的long类型,这主要取决于具体的编译器,且对于位数大于8bit的处理器。
例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排进入内存的问题。
因此就产生了大端存储和小端存储模式。
大端存储模式是指:数据的低位字节序保存在内存的高地址中,而数据的高位字节序保存在内存的低地址中,小端存储模式则恰恰相反。比如李华将十六进制的数值0x1234abcd,写入到0x0000开始的内存中,大端模式将会从右向左依次读取较低位的字节,存入地址较大的内存单元中,而小端模式将会从右向左依次读取较低位的字节。
我们常使用的X86是小端模式,而Keil/C51则为大端模式,很多的ARM,DSP都为小端模式。
有些ARM处理器还可以选择切换大端模式和小端模式,对于大小端模式,涉及到计算机底层原理,在这里就不做延伸了。
言归正传,那么如何通过共用体来判断当前计算机是大端还是小端呢?
首先我们可以定义一个共用体A,包含一个short类型和一个char类型,并创建一个共用体变量a1,这时,内存中会划分出2字节的大小,用于存放a1变量。
我们可以给a1的short类型s赋于一个16进制的值,虽然a1中的char类型数组没有被赋值,但其内存空间已经被占用了,且数组中的两个单独变量各代表的内存空间大小都是1个字节,正好只占据了short类型2字节变量的一半空间,所以,我们可以查看两个char类型变量中保存的值,从而判断程序存放short类型变量的方式。
如果高地址中存放了低位字节,即地址编号较大的内存空间中存放了位数最小的数值0x34,c[0]的值为12(十六进制),c[1]的值为34(十六进制),则可以判断机器为大端存储。
如果高地址中存放了高位字节,即地址编号较大的内存空间中,存放了位数最大的数值0x12,c[0]的值为34(十六进制),c[1]的值为12(十六进制),则可以判断机器为小端存储。
可以通过打印语句观察输出结果,以下是我的执行结果。
可以看出编译器是将数据的低位存于内存的低地址处,数据的高位存于内存的高地址处,从而得出我当前计算机的编译器为小端模式,你的计算机是什么存储模式呢?
代码实战#include
typedef union {
short a;
char b[2];
}_U共用体;
int main() {
_U共用体 U共用体;
U共用体.a = 0x1234;
printf("值:%x 地址:%p\n", U共用体.b[0], &U共用体.b[0]); //这里打印低位34
printf("值:%x 地址:%p\n", U共用体.b[1], &U共用体.b[1]); //这里打印高位12
//由此可以判断我的电脑为“小端存储”,也说明了数组是从左到右的
return 0;
}
演示效果
【你乐科技版权】站内所发布的一切原创内容,转载请说明是由《你乐科技》发布,内容仅限用于学习和研究,不得用于商业或非法用途,否则,一切后果请用户自负。本站信息部分来自网络,版权争议与本站无关。您必须在下载后的24小时内,彻底删除上述内容。如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。
邮箱地址:nilekeji@163.com
最后于 7月前
被酷乐Happy编辑
,原因:
c语言联合有什么作用,C语言union共用体(联合体)基础知识及实际用途相关推荐
- 【零基础学C语言】知识总结八:struct 结构体与 union 共用体
struct 结构体 struct即结构体,C程序中经常需要用相关的不同类型的数据来描述一个数据对象.例如,描述学生的综合信息时,需要使用学生的学号.姓名.性别等不同类型的数据时,像这种数据类型总是在 ...
- c语言的应用与作用,C语言主要应用在什么地方?
C语言是一种计算机程序设计语言.它既有高级语言的特点,又具有汇编语言的特点.它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序.因此,它的应用范围 ...
- c语言程序头文件作用,C语言头文件
C语言头文件教程 C 语言的头文件一般都是 .h 做为结尾的. C语言头文件详解 语法 #include 参数 参数 描述 filename 我们需要引入的头文件的名称. 说明 C 语言的头文件一般都 ...
- c语言对编程对作用,c语言编程心得体会
c语言编程心得体会 c语言是在国内外广泛使用的一种计算机语言.以下是小编整理的c语言编程心得体会,欢迎大家阅读! c语言编程心得体会1 说到我学习c语言时,真是用千言万语呀!记得刚开始学的时候,我的c ...
- C语言结构标记的作用,C语言基础知识之词法符号
任何高级语言都有自定义的词法符号和支持的数据类型. 词法符号是语言的基本组成单位,数据类型是数据的基本属性.这里我将先对C语言的C法符号做一个小的总结,既是对我自己C语言的一个系统的整理与提高,也希望 ...
- c语言eof不起作用,c语言程序设计 怎么以输入EOF结束
EOF(EndOfFile)是C语言中的文件结束标志符.当C语言输入函数获取到文件结尾标志时,会通过返回值的方式体现该值.所以要以输入EOF为结束,就需要判断输入函数的返回值.EOF定义在stdio. ...
- c语言链表head的作用,c语言链表的用法
c语言链表的用法 链表是数据结构中比较基础也是比较重要的类型之一,那么有了数组,为什么我们还需要链表呢!或者说设计链表这种数据结构的初衷在哪里?下面小编就为大家介绍下c语言链表的用法. c语言枚举的用 ...
- c语言switch有什么作用,c语言switch语句如何使用
C语言的运用非常之多,它兼顾了高级语言的汇编语言的优点,相较于其它编程语言具有较大优势.那么C语言中的switch语句如何使用呢? C语言switch语句如何使用 switch语句允许测试变量与值列表 ...
- c语言(cn)括号的作用,c语言小括号的用法
c语言小括号的用法 C语言的小括号里面表示一条语句,返回值是多条语句中最靠右的语句的返回值,比如(a=2,b=3,c=a+b),返回值就是c的值.下面小编就为大家介绍c语言小括号的用法. c语言小括号 ...
最新文章
- ASP.NET 2.0在SQL Server 2005上自定义分页
- 无线网络(5) 无线网络安全性
- 网工必看,万字网络排错笔记
- 动态开点线段树(多棵线段树)的内存分配与回收
- LeetCode 1019. 链表中的下一个更大节点(单调栈)
- 线程池中 corePoolSize, maximumPoolSize, poolSize理解
- 人员梯度培养_人员管理 | 生产班组员工队伍管理及制度建立
- 酷客多小程序携手Richly network Pte Led正式进军新加坡市场
- db2和oracle数据同步,DB2与Oracle数据库之间的远程复制(转)
- 联发科被动“卡位”内地集成电路市场 剑指老对手展讯
- vue集成spreadjs
- 【20211206】【信号处理】时频分析 —— 短时傅里叶变换(STFT)
- 动态修改窗口标题和类名
- Mysql出现问题:ERROR 2058: Plugin caching_sha2_passward could not be loaded解决方案
- java循环屏障,Java并发编程系列23|循环屏障CyclicBarrier
- 美国优秀教师对中国家长的建议
- 指标归因平台建设思路
- Python【爬虫实战】爬取美女壁纸资源
- 【无标题】win11安装Oracle 12c [INS-32102] 指定的 Oracle 主目录用户已存在
- 彻底卸载SQL Server2017
热门文章
- matebook x pro 2019 安装ubuntu 16.04
- php nav,HTML5 nav标签怎么用
- WebRTC 服务器要干些什么
- 小波理论的基本概念及概述 学习笔记
- 网络域名与IP地址的关系
- fiddler4手机安装证书失败解决教程
- 可视化工具Visdom的使用
- MySQL 的记录存储结构、存储引擎与 Buffer Pool
- php webp 图片,图片转换webp · phpfangting/php-webp Wiki · GitHub
- hashmap 从头到尾_从头到尾开发和销售机器学习应用程序