我是靠谱客的博主 要减肥蛋挞,最近开发中收集的这篇文章主要介绍数据结构学习之 union 共用体(union 到底有什么用?),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1、引言

共用体常用来节省内存,特别是一些嵌入式编程,内存是非常宝贵的!
共用体也常用于操作系统数据结构或硬件数据结构!
union 在操作系统底层的代码中用的比较多,因为它在内存共享布局上方便且直观。所以网络编程,协议分析,内核代码上有一些用到 union 都比较好懂,简化了设计。

共用体(union)是一种数据格式,它能够存储不同类型的数据,但是只能同时存储其中的一种类型。主要用处分以下几个方面

2、测试大小端模式

大小端不同,则存储的方式也存在差别,比如int需要4个字节,而char只需要1个字节,根据1个字节所在的具体位置即可判定CPU的模式。

union TestCPU
{
     int i;
     char ch;
};
void testCPUMode(void)
{
    union TestCPU Test;
    Test.i = 1;
    if(Test.ch == 1)
    {
      //这个CPU是小端模式
    }
    else
    {
       //这种情况下就是大端模式
    }
}

如果是 little endian 字节序的话,那个Test.i = 1;的内存从小到大依次放的是:0x01 0x00 0x00 0x00,如是,按照i的起始地址变成按照char 方式(1字节)存取,即得c = 0x01;
反之亦然

2.1 大小端转换函数

/*1.宏定义*/
#define Little_To_LargeOfEndian(x) (((x&0xff)<<24)|((x&0xff00)<<8)| 
((x&0xff0000)>>8)|((x&0xff000000)>>24))      
 //1.四个字节的排放顺序要弄清楚

/*2.写成函数*/
void Little_To_LargeOfEndian(int x)
{
    char a,b,c,d;
    a=(char)(x&0xff);
    b=(char)((x&0xff00)>>8); //3. 字符类型转换的优先级高于移位,所以用括号把移位操作括起来~
    c=(char)((x&0xff0000)>>16);
    d=(char)((x&0xff000000)>>24);
    //printf("0x%x 0x%x 0x%x 0x%xn",a,b,c,d);
    x=(a<<24)|(b<<16)|(c<<8)|d;
    printf("after transfered x is 0x%xn",x);
}

3、实现多种数据类型之间转换

3.1 案例一

union Type
{
   int i;
   char ch;
   long lint;
   ....
};

...
union Type type;

这样各种类型的数据共用存储空间,很方便的实现了不同数据类型之间的转换,不需要显示的强制类型转换。

union相比struct更加的节省空间。

3.2 案例二(很常用)

在嵌入式系统开发中,有时需要将一些变量存储在EEPROM中,变量类型若是char、int就很好办,可是如果要存储float、double类型的变量怎么办呢?
这个问题可以用共用体解决:

union myfloat
{
    char i[4];
    float j;
}Test;

因为float是四个字节,因此我们定义一个4个元素的char数组和float公用一段内存,接下来就是EEPROM存取了

在程序中要使用 j 的地方使用Test.j就行了,想把 j 写入EEPROM可以这样:

EEPROM_WRITE(0,myfloat.i[0]);
EEPROM_WRITE(1,myfloat.i[1]);
EEPROM_WRITE(2,myfloat.i[2]);
EEPROM_WRITE(3,myfloat.i[3]);

注:上面参数0、1、2、3为EEPROM地址,上面的EEPROM_WRITE只是示意,有时需要对地址使用(void*)进行类型转换

想把 j 从EEPROM读出可以这样:

myfloat.i[0]=EEPROM_READ(0);
myfloat.i[1]=EEPROM_READ(1);
myfloat.i[2]=EEPROM_READ(2);
myfloat.i[3]=EEPROM_READ(3);

然后在程序中继续使用Test.j就可以了。

4、寄存器的定义,实现整体的访问和单项的访问

struct register
{
	char a;
	char b;
	char c;
	char d;
};

union Register
{
   struct register;
   int whole;
};

这样就能实现单项和整体的访问,特别是引入位域操作等相关结构以后,能够实现每一个bit的访问。

最后

以上就是要减肥蛋挞为你收集整理的数据结构学习之 union 共用体(union 到底有什么用?)的全部内容,希望文章能够帮你解决数据结构学习之 union 共用体(union 到底有什么用?)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部