CPU的大小端模式以及判斷方法

2021-08-22 03:24:53 字數 1405 閱讀 2342

不同體系結構的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.i = 1;

return (endian.c == 1);

}

函式返回0是大端模式,返回1則是小端模式。

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佔四個位元組的長度...

大小端模式以及兩種判斷方法

首先來看某百科定義 這裡我們看到其實大端小端就是資料在記憶體中的存放的位元組順序。其實上面的定義有點兒難以記憶,總感覺很繞,乙個我覺得高效的記憶方式就是 之所以出現這樣的問題,是因為乙個位元組是8位,而現在cpu中的暫存器的位數是大於8的 一般來講,多少位的處理器暫存器就多少位 所以就存在乙個從記憶...