首先我們介紹乙個聯合體的概念。
在進行某些演算法的c語言程式設計的時候,需要使幾種不同型別的變數存放到同一段記憶體單元中。也就是使用覆蓋技術,幾個變數互相覆蓋。這種幾個不同的變數共同占用一段記憶體的結構,在c語言中,被稱作「共用體」型別結構,簡稱共用體,也叫聯合體。
聯合體的特別之處
「聯合」與「結構」有一些相似之處。但兩者有本質上的不同。在結構中各成員有各自的記憶體空間,乙個結構
變數的總長度是各成員長度之和。而在「聯合」中,各成員共享一段記憶體空間,乙個聯合變數的長度等於各成員中最長的長度。應該說明的是,這裡所謂的共享不是指把多個成員同時裝入乙個聯合變數內,而是指該聯合變數可被賦予任一成員值,但每次只能賦一種值,賦入新值則衝去舊值。如前面介紹的「單位」變數,如定義為乙個可裝入「班級」或「教研室」的聯合後,就允許賦予整型值(班級)或字串(教研室)。要麼賦予整型值,要麼賦予字串,不能把兩者同時賦予它。聯合型別的定義和聯合變數的說明乙個聯合型別必須經過定義之後,才能把變數說明為該聯合型別。
big-endian是一種大值的一端(序列中更典型值)存在前面(在最小的儲存位址)的順序。little-endian是一種小值的一端(序列中較不典型的值)儲存在前的順序。
intel的微處理器一般是小端模式,ibm的370主機,多數基於risc計算機,和motorola的微處理器使用big-endian方法。tcp/ip也使用big-endian方法(因此big-endian方法也叫做網路編碼)。
c筆試題
(判斷大端小端模式) 試題1:請寫乙個c函式,若處理器是big_endian的,則返回0;若是little_endian的,則返回1。
解答:#include
int checkcpu()
c;c.a = 1;
return(c.b ==1);}
int main()
剖析:嵌入式系統開發者應該對little-endian和big-endian模式非常了解。採用little-endian模式的cpu對運算元的存放方式是從低位元組到高位元組,而big-endian模式對運算元的存放方式是從高位元組到低位元組。例如,16bit寬的數0x1234在little-endian模式cpu記憶體中的存放方式(假設從位址0x4000開始存放)為:
記憶體位址
0x4000
0x4001
存放內容
0x34
0x12
而在big-endian模式cpu記憶體中的存放方式則為:
記憶體位址
0x4000
0x4001
存放內容
0x12
0x34
記憶體位址
0x4000
0x4001
0x4002
0x4003
存放內容
0x78
0x56
0x34
0x12
而在big-endian模式cpu記憶體中的存放方式則為:
記憶體位址
0x4000
0x4001
0x4002
0x4003
存放內容
0x12
0x34
0x56
0x78
聯合體union的存放順序是所有成員都從低位址開始存放,面試者的解答利用該特性,輕鬆地獲得了cpu對記憶體採用little-endian還是big-endian模式讀寫。如果誰能當場給出這個解答,那簡直就是乙個天才的程式設計師。
另外個例子:
#include
int main()
u;if(sizeof(short) == 2)
else if(u.c[0] == 2 && u.c[1] == 1)
return 0;}}
**至微博
**至微博
寫乙個函式判斷系統是大端還是小端
include union node int main 把int的每個位元組讀出來。要是第乙個位元組為0證明是大端模式 寫乙個函式判斷系統是大端還是小端。若處理器是big endian的,則返回0 若是little endian的,則返回1.大端格式 在這種格式中,字資料的高位元組儲存在低位址中,而...
寫乙個函式判斷儲存空間是大端還是小端
判斷儲存空間是大端還是小端 我們常用的x86結構都是小端模式,而大部分dsp,arm也是小端模式,不過有些arm是可以選擇大小端模式。所以對於上面的maxheight是應該以小端模式來存放,具體情況請看下面兩表。小端模式 大端模式 通過上面的 可以看出來大小端的不同,在這裡無法討論那種方式更好,個人...
M4 是乙個巨集處理器
m4的內容 m4 是乙個巨集處理器.將輸入拷貝到輸出,同時將巨集展開.巨集可以是內嵌的也可以是使用者定義的.除了可以展開巨集,m4還有一些內建的函式,用來引用檔案,執行unix命令,整數運算,文字操作,迴圈等.m4既可以作為編譯器的前端也可以單獨作為乙個巨集處理器.安裝下列程式 m4 簡短說明 m4...