linux中聯合體union實現判斷little endian 和 big endian(大端和小端)
1、聯合體的資料成員從低位元組開始對齊
2、 little endian 和 big endian。
little endian 和 big endian 是 cpu 存放資料的兩種不同順序。對於整型、長整型等資料型別, big endian 認為第乙個位元組是最高位位元組(按照從低位址到高位址的順序存放資料的高位位元組到低位位元組);而 little endian 則相反,它認為第乙個位元組是最低位位元組(按照從低位址到高位址的順序存放資料的低位位元組到高位位元組)。
假設乙個資料為0x1234abcd,其位址為 0x0000 的四個位元組變數,若位元組序為 big-endian,則讀的第乙個位元組0x00存放的資料為12;
若位元組序位 little-endian,則讀出結果為 cd。
一般來說, x86 系列 cpu 都是 little-endian 的位元組序, powerpc 通常是 big endian,還有的 cpu 能通過跳線來設定 cpu 工作於 little endian 還是 big endian 模式.
linux中的實現源**
static union endian_test = };
#define endianness ((char)endian_test.l)
如果 endianness=』l』表示系統為 little endian,為』b』表示 little endian
在巨集定義中取得是endian_test.l中的最低位,通過強制轉換來實現,將其轉換成char型別的資料,取得其四位元組中的最低位元組。
因為聯合體的資料成員從低位元組開始對齊,在輸入聯合體中的資料時從最低位元組開始輸入,即』i』在最低位元組,'b』在最高位元組,共四個位元組,當讀取endian_test.l時,其占用四個位元組,強制轉換讀取endian_test.l的最低位資料,為i時表明它的最低位在最低位元組,為d時表明它的最低位在最高位元組,從而判斷出cpu是little endian還是little endian
C語言聯合體union
c語言中的聯合體union 在c c 程式的編寫中,當多個基本資料型別或復合資料結構要占用同一片記憶體時,我們要使用聯合體 當多種型別,多個物件,多個事物只取其一時 我們姑且通俗地稱其為 n 選1 我們也 可以使用聯合體來發揮其長處。首先看一段 union myun u int k a int ma...
C語言之聯合體Union
共用體是一種特殊的資料型別,允許您在相同的記憶體位置儲存不同的資料型別。您可以定義乙個帶有多成員的共用體,但是任何時候只能有乙個成員帶有值。共用體提供了一種使用相同的記憶體位置的有效方式。定義共用體union 為了定義共用體,您必須使用union語句,方式與定義結構類似。union 語句定義了乙個新...
C語言中的聯合體union
在c c 程式的編寫中,當多個基本資料型別或復合資料結構要占用同一片記憶體時,我們要使用聯合體 當多種型別,多個物件,多個事物只取其一時 我們姑且通俗地稱其為 n 選1 我們也 可以使用聯合體來發揮其長處。首先看一段 union myun u int k a int main union型別是共享記...