C语言中利用联合体巧妙处理数据

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

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

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

在内存在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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

给字符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]); } }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

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

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

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

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

(0)

相关推荐