union類型

最新,在學習嵌入式底層代碼,看到一些union的使用,這邊做一個總結:

struct和union的重要區別:

struct爲每個字段在不同的偏移處分配存儲空間,而Union則將所有的字段重疊在內存中的相同偏移處。

聯合類型的用途:

1、創建別名。別名是內存對象原名之外的其他名字。比如在程序中經常會用到將一個數據類型強制轉換爲另一個類型,這個操作可以使用聯合來代替。

比如

typedef union{

    char c;

    uint32 u;

}CharOfUnion v;

可以通過v.u來操作一個uint32類型的對象,當需要將uint32變量的低端字節看做一個字符的時候,只需要訪問v.c就可以了。

實際應用中,大多數的協議結構定義中,都會使用union類型來定義。

2、使用聯合來將較大的對象分解成組成這個對象的各個字節。(尤其在單片機編程中將float拆解成char)

typedef union{

    uint u;

    char bytes[4];

}asBytes composite;

可以使用composite.bytes數組來訪問composite.u字段的各個字節。

一般在Windows API的一些數據結構中才能看到這個union,其實並不複雜。本質上來說和結構體是一樣的,但是從包裝的角度來看有差異。

1、union中可以定義多個成員,union的大小由最大的成員的大小決定。
2、union成員共享同一塊大小的內存,一次只能使用其中的一個成員。
3、對某一個成員賦值,會覆蓋其他成員的值(也不奇怪,因爲他們共享一塊內存。但前提是成員所佔字節數相同,當成員所佔字節數不同時只會覆蓋相應字節上的值,比如對char成員賦值就不會把整個int成員覆蓋掉,因爲char只佔一個字節,而int佔四個字節)

4、聯合體union的存放順序是所有成員都從低地址開始存放的。


union 判斷大端小端問題

當多個字節整數的最低地址的字節容納的是最低有效位時就叫做小端。
當多個字節整數的最低地址的字節容納的是最高有效位時就叫做大端。
下面這段code 可以輕鬆判斷大端小端。

#include<stdio.h>

int main(void)
{
		union{
					int as_int;
					short as_short[2];
					char as_char[4];
			}either;
		
		either.as_int = 0x12345678;
		if (sizeof(int) == 4 && either. as_char[0] == 0x78){
				printf("Little endian\n");
		}
		else if (sizeof(int) == 4 && either.as_char[0] == 0x12){
				printf("Big endian\n");
		}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章