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共用体(联合体)基础知识及实际用途相关推荐

  1. 【零基础学C语言】知识总结八:struct 结构体与 union 共用体

    struct 结构体 struct即结构体,C程序中经常需要用相关的不同类型的数据来描述一个数据对象.例如,描述学生的综合信息时,需要使用学生的学号.姓名.性别等不同类型的数据时,像这种数据类型总是在 ...

  2. c语言的应用与作用,C语言主要应用在什么地方?

    C语言是一种计算机程序设计语言.它既有高级语言的特点,又具有汇编语言的特点.它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序.因此,它的应用范围 ...

  3. c语言程序头文件作用,C语言头文件

    C语言头文件教程 C 语言的头文件一般都是 .h 做为结尾的. C语言头文件详解 语法 #include 参数 参数 描述 filename 我们需要引入的头文件的名称. 说明 C 语言的头文件一般都 ...

  4. c语言对编程对作用,c语言编程心得体会

    c语言编程心得体会 c语言是在国内外广泛使用的一种计算机语言.以下是小编整理的c语言编程心得体会,欢迎大家阅读! c语言编程心得体会1 说到我学习c语言时,真是用千言万语呀!记得刚开始学的时候,我的c ...

  5. C语言结构标记的作用,C语言基础知识之词法符号

    任何高级语言都有自定义的词法符号和支持的数据类型. 词法符号是语言的基本组成单位,数据类型是数据的基本属性.这里我将先对C语言的C法符号做一个小的总结,既是对我自己C语言的一个系统的整理与提高,也希望 ...

  6. c语言eof不起作用,c语言程序设计 怎么以输入EOF结束

    EOF(EndOfFile)是C语言中的文件结束标志符.当C语言输入函数获取到文件结尾标志时,会通过返回值的方式体现该值.所以要以输入EOF为结束,就需要判断输入函数的返回值.EOF定义在stdio. ...

  7. c语言链表head的作用,c语言链表的用法

    c语言链表的用法 链表是数据结构中比较基础也是比较重要的类型之一,那么有了数组,为什么我们还需要链表呢!或者说设计链表这种数据结构的初衷在哪里?下面小编就为大家介绍下c语言链表的用法. c语言枚举的用 ...

  8. c语言switch有什么作用,c语言switch语句如何使用

    C语言的运用非常之多,它兼顾了高级语言的汇编语言的优点,相较于其它编程语言具有较大优势.那么C语言中的switch语句如何使用呢? C语言switch语句如何使用 switch语句允许测试变量与值列表 ...

  9. c语言(cn)括号的作用,c语言小括号的用法

    c语言小括号的用法 C语言的小括号里面表示一条语句,返回值是多条语句中最靠右的语句的返回值,比如(a=2,b=3,c=a+b),返回值就是c的值.下面小编就为大家介绍c语言小括号的用法. c语言小括号 ...

最新文章

  1. ASP.NET 2.0在SQL Server 2005上自定义分页
  2. 无线网络(5) 无线网络安全性
  3. 网工必看,万字网络排错笔记
  4. 动态开点线段树(多棵线段树)的内存分配与回收
  5. LeetCode 1019. 链表中的下一个更大节点(单调栈)
  6. 线程池中 corePoolSize, maximumPoolSize, poolSize理解
  7. 人员梯度培养_人员管理 | 生产班组员工队伍管理及制度建立
  8. 酷客多小程序携手Richly network Pte Led正式进军新加坡市场
  9. db2和oracle数据同步,DB2与Oracle数据库之间的远程复制(转)
  10. 联发科被动“卡位”内地集成电路市场 剑指老对手展讯
  11. vue集成spreadjs
  12. 【20211206】【信号处理】时频分析 —— 短时傅里叶变换(STFT)
  13. 动态修改窗口标题和类名
  14. Mysql出现问题:ERROR 2058: Plugin caching_sha2_passward could not be loaded解决方案
  15. java循环屏障,Java并发编程系列23|循环屏障CyclicBarrier
  16. 美国优秀教师对中国家长的建议
  17. 指标归因平台建设思路
  18. Python【爬虫实战】爬取美女壁纸资源
  19. 【无标题】win11安装Oracle 12c [INS-32102] 指定的 Oracle 主目录用户已存在
  20. 彻底卸载SQL Server2017

热门文章

  1. matebook x pro 2019 安装ubuntu 16.04
  2. php nav,HTML5 nav标签怎么用
  3. WebRTC 服务器要干些什么
  4. 小波理论的基本概念及概述 学习笔记
  5. 网络域名与IP地址的关系
  6. fiddler4手机安装证书失败解决教程
  7. 可视化工具Visdom的使用
  8. MySQL 的记录存储结构、存储引擎与 Buffer Pool
  9. php webp 图片,图片转换webp · phpfangting/php-webp Wiki · GitHub
  10. hashmap 从头到尾_从头到尾开发和销售机器学习应用程序