用union判斷cpu的大小端

2021-05-26 01:15:55 字數 1974 閱讀 5250

版本1:

在arm體系中,每個字單元包含4個位元組單元或者兩個半字單元。在字單元中,4個位元組哪乙個是高位位元組,哪乙個是低位位元組則有兩種不同的格式:big-endian和little-endian格式。在小端模式中,低位位元組放在低位址,高位位元組放在高位址;在大端模式中,低位位元組放在高位址,高位位元組放在低位址。

在c語言中,不同於結構體,共用體(聯合體)中的幾種不同型別的變數存放在同一段記憶體單元中。利用這一特點,可以用聯合體變數判斷arm或x86環境下,儲存系統是是大端還是小端模式。

#include "stdio.h"

int main()

c;c.a=1;

if (c.b==1)

printf("it is little_endian!/n");

else

printf("it is big_endian!/n");

return 1;

}說明:

1  在c中,聯合體(共用體)的資料成員都是從低位址開始存放。

2  若是小端模式,由低位址到高位址c.a存放為0x01 00 00 00,c.b被賦值為0x01;

————————————————————————————

位址 0x00000000 0x00000001 0x00000002 0x00000003

c.a  01         00         00         00

c.b  01         00        

————————————————————————————  

3  若是大端模式,由低位址到高位址c.a存放為0x00 00 00 01,c.b被賦值為0x0;

————————————————————————————

位址 0x00000000 0x00000001 0x00000002 0x00000003

c.a  00         00         00         01

c.b  00         00                 

————————————————————————————  

4  根據c.b的值的情況就可以判斷cpu的模式了,現在xp環境下的intel cpu是小端模式,不信你可測試下

版本2:

請寫乙個c函式,若處理器是big_endian的,則返回0;若是little_endian的,則返回1

解答:

int checkcpu()

c; c.a = 1;

return (c.b == 1); 

} 剖析:

嵌入式系統開發者應該對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

32bit寬的數0x12345678在little-endian模式cpu記憶體中的存放方式(假設從位址0x4000開始存放)為:

記憶體位址 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模式讀寫。

在linux中也是用類似的方法來判斷的,在原始碼中可以找的到

CPU大小端判斷

big endian 認為第乙個位元組是最高位位元組 按照從低位址到高位址的順序存放資料的高位位元組到低位位元組 大端 而little endian 則相反,它認為第乙個位元組是最低位位元組 按照從低位址到高位址的順序存放資料的低位位元組到高位位元組 小端 用 c程式設計實現判斷,如下 測試你的機器...

判斷CPU的大小端

原文出處 下面的兩個程式均可判斷cpu的大小端問題 int i 1 char p char i if p 1 printf little endian little endian else printf big endian big endian 大小端儲存問題,如果小端方式中 i佔四個位元組的長度...

判斷CPU大小端儲存

首先明白big endian和little endian的位元組排序含義 big endian 乙個word中的高位的byte放在記憶體中這個word區域的低位址處。little endian 乙個word中的低位的byte放在記憶體中這個word區域的低位址處。例如 如果我們將0x1234abcd...