不同體系結構的cpu,資料在記憶體中存放的排列順序是不一樣的。
儲存器中對資料的儲存是以位元組(byte)為基本單位的,因此,字(word)和半字(half-word)在儲存器中就有兩種次序,分別稱為:大端模式(big endian)和小端模式(little endian)。
大端儲存模式是指字或半字的最高位元組(most significant bit,msb)存放在記憶體的最低位位元組位址上,而字資料的低位元組則存放在高位址中。打個比方,有乙個字為0x12345678,這個字由4個位元組組成,從高位到低位的次序為:0x12,0x34,0x56,0x78。如果把這個字存放在以0x00000000起始的記憶體中,這個字在記憶體中的實際存放情況如下表:
記憶體位址
儲存的資料(byte)
0x00000000
0x12
0x00000001
0x34
0x00000002
0x56
0x00000003
0x78
0x00000004 ……
大端模式的次序就像是我們平時書寫的次序,先寫大數,後寫小數。另外,大端儲存次序還廣泛運用在tcp/ip協議上,因此又稱為網路位元組次序。
小端儲存模式是指字或半字的最低位位元組(lowest significant bit,lsb)存放在記憶體的最低位位元組位址上,而字資料的高位元組則存放在高位址中。還以0x12345678為例,在小端模式下儲存如下表所示:
記憶體位址
儲存的資料(byte)
0x00000000
0x78
0x00000001
0x56
0x00000002
0x34
0x00000003
0x12
0x00000004 ……
需要注意的幾點是:
(1) 資料在暫存器中都是以大端模式次序存放的。
(2) 對於記憶體中以小端模式存放的資料。cpu訪問數成時,小端和大端之間的轉換是通過硬體實現的,沒有資料載入/儲存的開銷。
知道了大小端模式的概念,但如果讓我們用c語言寫段**判斷乙個cpu是大端模式還是小端模式應當如何做呢 ?
要用c語言簡潔的實現就要用到聯合體(union),簡單的說union就是一種結構,在union中所有的資料成員共用乙個儲存空間,在同一時間只能儲存其中的乙個資料成員,所有的資料成員具相同的起始位址,相對於基位址的偏移量都為0;
採用union來判斷,具體**如下:
int checkendian(void)
endian;
endian.word=1;
if(1 == endian.half)
return little_endian;
else
return big_endian;
}
CPU的大小端模式
不同體系結構的cpu,資料在記憶體中存放的排列順序是不一樣的。儲存器中對資料的儲存是以位元組 byte 為基本單位的,因此,字 word 和半字 half word 在儲存器中就有兩種次序,分別稱為 大端模式 big endian 和小端模式 little endian 大端儲存模式是指字或半字的最...
CPU大小端判斷
big endian 認為第乙個位元組是最高位位元組 按照從低位址到高位址的順序存放資料的高位位元組到低位位元組 大端 而little endian 則相反,它認為第乙個位元組是最低位位元組 按照從低位址到高位址的順序存放資料的低位位元組到高位位元組 小端 用 c程式設計實現判斷,如下 測試你的機器...
判斷乙個CPU大小端模式
請寫乙個c函式,若處理器是big endian的,則返回0 若是little endian的,則返回1 解答 int checkcpu c c.a 1 return c.b 1 剖析 嵌入式系統開發者應該對little endian和big endian模式非常了解。採用little endian模...