版本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...