在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的低位。不論改變整形變量還是字符變量時,另一個變量的值也會發生改變。
這樣當需要將一個整形拆分成高位和低位或者要將兩個字符組合成一個整形時,可以利用聯合體這個特性去處理數據。