在C语言处理数据的时候,经常会遇到将一个整形数据拆分成高位和低位,或者是将两个字符型数据组合成一个整形数据。通常的做法是将数据左移或者右移对数据进行组合或者拆分。现在可以利用联合体的特性来处理这一类数据。
联合体又叫共用体,共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。

共用体(Union),它的定义格式为:
union 共用体名{
成员列表
};
先看一个例子:

union data{long n;char ch;short m;};

在内存在n、ch、m占用共同一段内存。

字符ch占用第一个字节,短整形m占用1、2字节,整形n占用1、2、3、4字节,用一段代码测试下:

union data{long n;char ch;short m;};void main( void )
{union data tem;__asm( "sim" );                             //禁止中断SysClkInit();delay_init( 16 );Uart1_Init( 9600 );__asm( "rim" );while( 1 ){delay_ms( 500 );      tem.ch=0x12;printf("%#x,%#x,%#lx\r\n",tem.ch,tem.m,tem.n);}
}

给字符ch赋值0x12,然后打印ch,m,n,看看这三个数输出的值是多少。打印结果如下:

在仿真其中观察这三个值

这三个值在内存中的起始地址都是一样的。可以看到给字符ch赋值0x12后,m和n的值高位都为0x12,低位值是随机的。

下来给m赋值0x3456,在打印看看结果


给m赋值0x3456后,ch的值为m的高位0x34,n的值高位和m的值相等,n的低位值是随机的。
下来给n赋值0x12345678,看看ch和m的值是多少


可以看到当给n赋值后,ch和m的值都变了。ch的值是n值得最高2位,m的值是n值得最高4位。
通过这几个测试可以明显得看到ch、m、n这三个变量在内存中共用了同一段内存地址,改变一个变量的值时,其他变量值也会发生改变。
下来利用共用体的这个特性来让两个字符型变量和一个整形变量占用同一块地址。


union data{ int n;char ch[2];
};void main( void )
{union data tem;__asm( "sim" );                             //禁止中断SysClkInit();delay_init( 16 );Uart1_Init( 9600 );__asm( "rim" );while( 1 ){delay_ms( 500 );tem.n=0x1234;printf("%#x,%#x,%#x\r\n",tem.n,tem.ch[0],tem.ch[1]);printf("------------------------\r\n");tem.ch[0]=0x56;tem.ch[1]=0x78;printf("%#x,%#x,%#x\r\n",tem.n,tem.ch[0],tem.ch[1]);}
}

在共用体中设置一个整形变量,和一个字符数组,字符数组长度为2.这样两个字符变量的长度刚好和一个整形变量长度相等。

当给整形变量n赋值0x1234时,字符数组ch[0]值变为了0x12,字符数组ch[1]的值变为了0x34。

下来给字符数组ch[0]和ch[1]分别赋值时,整形变量n的值刚好是字符数组的组合。

字符变量ch[0]是变量n的高位,字符变量ch[1]是变量n的低位。不论改变整形变量还是字符变量时,另一个变量的值也会发生改变。
这样当需要将一个整形拆分成高位和低位或者要将两个字符组合成一个整形时,可以利用联合体这个特性去处理数据。

C语言中利用联合体巧妙处理数据相关推荐

  1. C语言union合并两个字节,C语言中的联合体union所占内存方式

    当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union).在C Programming Language 一书中对于联合体是这么描述的: 1)联合体是一个结构: 2)它的所有成员 ...

  2. 【重温经典C语言】~c语言中%x、%c、%d、%x等等等、c语言取地址符的作用、C语言中的 联合体

    本章目录: 1. c语言中%x.%c.%d.%x等等等 2. c语言取地址符&的作用 3. 了解 C语言中的 联合体 3.1 什么是联合体? 3.2 定义 3.2.1 举例 3.3 初始化联合 ...

  3. c语言可以利用数组处理批量数据库,C语言程序设计 利用数组处理批量数据.ppt...

    C语言程序设计 利用数组处理批量数据.ppt 6. strlen函数----测字符串长度的函数 其一般形式为: strlen (字符数组) 它是测试字符串长度的函数 函数的值为字符串中的实际长度 6. ...

  4. C语言中利用Swap函数交换变量a,b

    C语言中利用Swap函数交换变量a,b 常见错误写法 error1 void Sawp_error1(int a,int b) {int tmp;tmp=a;a=b;b=tmp; } int main ...

  5. 【示例】C语言中利用数组存放函数指针

    C语言中利用数组存放函数指针,增加函数使用的灵活性.使用时只需提供数组索引,即可调用不同函数. 预备知识: 1.指向函数的指针 一个函数在编译时被分配一个入口地址,这个地址就被称为函数的指针. 例如: ...

  6. MVC中利用ViewBag传递Json数据时的前端处理方法

    ** MVC中利用ViewBag传递Json数据时的前端处理方法 ** 用viewBag传递Json字符串到前端时,json字符串中的"会被转义为& quot,前端处理方法为@Htm ...

  7. c语言读取文件字节数,怎么在C语言中利用fstat函数获取文件的大小

    怎么在C语言中利用fstat函数获取文件的大小 发布时间:2021-01-22 17:03:17 来源:亿速云 阅读:110 作者:Leah 怎么在C语言中利用fstat函数获取文件的大小?针对这个问 ...

  8. keil551的芯片包不能用_r语言中使用Bioconductor 分析芯片数据

    原文链接: r语言中使用Bioconductor 分析芯片数据​tecdat.cn 介绍 芯片数据分析流程有些复杂,但使用 R 和 Bioconductor 包进行分析就简单多了.本教程将一步一步的展 ...

  9. C++中的结构体,C管理进程代码,C++管理进程代码,C语言中的联合体

     1.C++中的结构体 #include<iostream> struct lstruct { int num; }; struct MyStruct { int num; doubl ...

最新文章

  1. [unreal4入门系列之十四] 在UE4中添加碰撞触发事件
  2. 海量数据处理算法—Bit-Map
  3. CodeForces - 1497E2 Square-free division (hard version)(dp+数论)
  4. ELK日志分析系统(转)
  5. 基于JavaSpringmvc+myabtis+html的鲜花商城系统设计和实现
  6. REST API 概念的简单介绍
  7. Web Application Security 网络应用程序安全 - (二)2010年网络安全威胁排行榜TOP 10...
  8. 8 个 Linux 下 ls 命令的高级用法!个个惊艳!
  9. 计算机办公自动化试题及答案,计算机等级考试,办公自动化考试试题(三)
  10. 十六进制的字符对照表
  11. 神经网络算法开篇——逻辑回归
  12. 基于高德地图API — 绘制热力图初尝试
  13. 团队博客-应用功能说明书
  14. discuz模板机制
  15. Creational patterns
  16. 一个创业失败案例的复盘
  17. Android开发之渐变效果gradient属性
  18. 计算机组成原理——中央处理器
  19. 改造create-react-app 引入dva和antd
  20. 利用python进入数据分析之数据规整化:清理、转换、合并、重塑(二)

热门文章

  1. mysql数据库binlog日志截断报错,导致mysql主从同步失败故障排查
  2. H3C之虚拟路由器冗余协议(VRRP)的原理及应用
  3. 跟着例子一步步学习redux+react-redux[转载]
  4. Struts(十四):通用标签-form表单
  5. 用上Latex实现编辑伪代码
  6. NOIP201501金币
  7. [BAT]TASKKILL 杀进程
  8. windows下javadoc生成文档注释的命令
  9. 反三角函数在线计算机,f的换算(反三角函数计算器在线)
  10. win10怎么去掉计算机里百度云,主编教你win10系统清除百度云盘盘符的修复方法...