CPU的大小端模式

2021-06-08 03:23:49 字數 1544 閱讀 3176

不同體系結構的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來判斷,具體**如下:

[cpp]view plain

copy

print?

intcheckendian(

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的大小端模式以及判斷方法

不同體系結構的cpu,資料在記憶體中存放的排列順序是不一樣的。儲存器中對資料的儲存是以位元組 byte 為基本單位的,因此,字 word 和半字 half word 在儲存器中就有兩種次序,分別稱為 大端模式 big endian 和小端模式 little endian 大端儲存模式是指字或半字的最...

判斷CPU的大小端

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