相信学过C语言的程序员对C语言的各种数据类型都非常熟悉,像数组、结构体、结构体数组、结构体指针这些数据类型大家都会信手捏来。然而,有些数据类型被我们不经意的边缘化了。它们没有数组、结构体这些数据类型用的广泛,但是却不容忽视,例如,枚举、联合等。

  今天我们就讨论一下union(联合)这个数据类型。C语言的发明者为什么要弄一个这种不常用甚至几乎不用的数据类型呢。下面给你答案。首先,看一下union的定义。

union Data {int i;3    char str[4];
} data; 

这段代码定义了一个名为data的union变量。它有什么属性呢?

  1. 这个变量在内存中占用4个字节的空间而不是8个;
  2. 有两个数据成员:int类型变量的i和char类型的数组str;
  3. 虽然有两个数据成员,但是这两个成员的存储空间是一样的

上面三点是union变量的最基本也是最重要的属性。详细说一下第三点。因为union不论包含多少个多少种数据类型,它实例化为变量后,这个变量的长度是这个union中最长的数据类型的长度。下面的代码定义了一个union变量。它的长度是16个字节。

 union DEMO{ char status;int a; int serial[4];
}demo;

     MSB                                                                                                             LSB

0 f e d c b a 9 8 7 6 5 4 3 2 1

上面这个表格代表内存中的数据,demo.status 的值为0x1;demo.a的值为,0x4321。以此类推demo.serial的值就出来了。这个属性是union特有的,C语言的发明者为什么要弄这么个数据类型呢?现在知道了吧。因为这个union特有的属性可以帮助我们节省好多行代码。而且还不用各种基础数据类型转换。

  union的应用

  设想用C语言实现这样一个功能。我需要用单片机读取一个监控温度的i2c slave的寄存器数据。这个寄存器是12位有效位寄存器。读出来之后我们要通过数据手册给定的公式计算成实际温度(设想这个公式为 temp = reg_val *10)。我们怎么实现呢?要知道,i2c的数据传输是按照byte传送的,也就是说,你只能用char类型结束数据,说白了,每个时序你只能接收8个bit的数据。所以12个bit需要读两次,用两个char类型变量或一个char类型数据接收。

  1. 读出寄存器数据(这个不在这篇文章的讨论范围内)
  2. 将读出的数据转换成可计算的数据类型(两个char类型转换成一个short或int或float类型)
  3. 根据公式计算

下面看一下不用union实现的函数

int fun( void )
{int tmp_value = 0; char reg_val[2] = {0,0}; .... i2c.read(addr<<1, reg_val, 2); tmp_value = (reg_val[1]<<8 | reg_val[0]); return tmp_value*10;
}

用union的

union REG_VAL { int value; char buf[2];
}reg_val; int fun( void )
{ int tmp_value = 0; char reg_val[2] = {0,0}; .... i2c.read(addr<<1, reg_val.buf, 2);return reg_val.value*10;
}

不用union的函数也可以用sprintf实现,那就更麻烦了。

  可以看到虽然在这里用union的代码比不用union的多了几行,但是i2c sensor如果多的话,那就会少很多,而且i2c sensor的寄存器有效位数不是一样的,这个用两个char类型就解决了,但是其他的可能需要用三个,所以用最上面定义的union变量可以很好的实现,不需要考虑各种转换问题。

  union还是很有用处的,所以不要忽视它了。

ps:原创不易,转载请注明出处

C语言之联合(union)的妙用相关推荐

  1. C/C++语言中联合体union的妙用

    联合体union的基本概念 在C/C++语言中,有时需要在同一段内存单元中存放不同类型的变量,如把一个整形变量int.一个字符型变量char和一个双精度实型变量double放在同一个地址开始的内存单元 ...

  2. union在c语言中的作用,c语言联合union的使用用途

    在使用联合的使用,我们通常用来判断大小端,但是其实不仅仅有这个用处. 我在网上看到还有其他的用途: 1.分离高低字节 这个需要结合cpu大小端来判断,原文如下: 这样的操作,而一个除法消耗四个机器周期 ...

  3. C语言 | 联合体(union)、typedef

    一.联合体union 1.联合体含义 联合 union 是一个能在同一个存储空间存储不同类型数据的类型: 联合体所占的内存长度等于其最长成员的长度倍数,也有叫做共用体: 同一内存段可以用来存放几种不同 ...

  4. C语言结构联合位字段知识体系总结大学霸IT达人

    C语言结构联合位字段知识体系总结大学霸IT达人 C语言的基础类型中只能去定义单一类型的变量用于指代数据,但在现实生活中我们常常要处理的数据却会包含多种类型的数据. 例如,公司员工的信息管理,每个员工的 ...

  5. C/C++中的联合 union

    联合(union)在C/C++里面见得并不多,但是在一些对内存要求特别严格的地方,联合又是频繁出现,那么究竟什么是联合.怎么去用.有什么需要注意的地方呢?就这些问题,我试着做一些简单的回答,里面肯定还 ...

  6. C语言学习—联合体Union和关键字Typedef

    C语言学习-联合体Union和关键字Typedef 前言 1 联合体Union 1.1 Union认知 1.2 Union应用 2 关键字typedef 前言 内容主要为联合体Union和关键字Typ ...

  7. C语言关键字之union

    C语言关键字之union 是什么呢 union 在C语言中可以被称为联合体,也有将其称为共用体.它是一种自定义类型,可以使用它来创建变量. 使用格式 union 联合体名称 { 变量 1: 变量 2: ...

  8. C语言数据类型:联合(union)

    1. 联合说明和联合变量定义     联合也是一种新的数据类型, 它是一种特殊形式的变量.     联合说明和联合变量定义与结构十分相似.其形式为:      union 联合名{           ...

  9. C语言丨关键字union的定义和使用

    union,中文名"联合体.共用体",在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量. 但在&quo ...

最新文章

  1. TCP协议客户端读取文本文件,服务器端输出到文本文件
  2. php+mysql 注入基本过程
  3. 使用代码获得table whered use list
  4. 使用layui弹框实现添加时,当添加成功之后如何进行关闭当前窗口刷新父页面的数据
  5. pat 乙级 1021 个位数统计(C++)
  6. php mvc教程 文档,PHP培训教程教你快速打造PHP MVC框架[PHP基础教程]
  7. 我的常用软件大公开!
  8. 数据结构之队列的特别实现
  9. 在CentOS下为sqlplus和rman 添加rlwrap
  10. maven ...../.m2/settings.xml
  11. python 个人项目_软工个人项目WC(Python实现)
  12. SecureCRT 7.3.4 安装图解----破解图解
  13. 超频到3200最佳时序_10900K内存搭配超频测试,七彩虹CVN捍卫者内存颜值标杆
  14. wps页眉怎么设置不同页码_Word:单双页页眉页码不同怎么设置?不同章节重新编码怎么设置?...
  15. 计算机和网络之间有个感叹号,电脑连接网络显示感叹号,教你电脑连接网络显示感叹号怎么办...
  16. 计算机多媒体技术的应用,计算机多媒体技术及其应用.ppt
  17. 献给android原生应用层开发初学者技术架构选型和整合的方案思路(二)
  18. 电话号码的数字组合(Java)
  19. 计算机(本科)课程安排表
  20. 计算机在医学影像学中有哪些应用,计算机辅助教学在医学影像学实习课中的应用...

热门文章

  1. 包含联想、微软、三星在内的七家企业疑似侵犯滑动选择及触摸屏输入专利被提起美国337调查
  2. 你不适合做Java程序员?大概是以下三个原因让你放弃了
  3. 从斗鱼顶级女主播来思考直播间画面的布局
  4. vtt字幕转srt,python代码,vtt字幕格式转换srt
  5. 2022广州国际塑料橡胶及包装印刷展览会
  6. mysql_常见语句避坑
  7. 金融统计分析与挖掘实战7.3-7.5
  8. Python每天学习计划
  9. 关于lua中的点号与冒号的区别与使用
  10. 【JSP/Servlet】基于WEB的通讯录系统