首先來看某百科定義:
這裡我們看到其實大端小端就是資料在記憶體中的存放的位元組順序。
其實上面的定義有點兒難以記憶,總感覺很繞,乙個我覺得高效的記憶方式就是:
之所以出現這樣的問題,是因為乙個位元組是8位,而現在cpu中的暫存器的位數是大於8的(一般來講,多少位的處理器暫存器就多少位),所以就存在乙個從記憶體中讀取資料到暫存器的順序問題。而不同處理器讀取記憶體的方式不同,所以不同的架構的記憶體存放也有所不同。我們常用的x86結構是小端模式,而keil c51則為大端模式。有些arm處理器還可以由硬體來選擇是大端模式還是小端模式。
下面拿乙個例子來說明:
假設我們現在有int型變數 0x12345678:,那麼如果是小端模式,即低尾端,資料的低位0x78在記憶體的低位位址中存放。其在記憶體的存放方式如下圖所示:
若是大端模式,即高尾端,那麼資料的低位0x78存在記憶體中的高位位址。其記憶體存放方式如下:
首先,要強調下不能用移位,位與等運算方式來判斷大小端模式:
因為前面提到過,大小端是資料在記憶體中的位元組存放順序,而運算指令是由cpu執行的,也就是說運算等方法其實是改變的cpu中暫存器的值,而暫存器中的值通過大小端模式已經得到了正確的資料存放順序。
所以我們可以定義聯合體如下:
//method 1
union bit
;
這個時候我們賦值 a = 0x12345678,如果低位位元組的b存放的是0x78,則說明是小端模式,若為0x12則為大端模式:
#include
union bit
;int
main()
//method 2
void
judge
(void
)
判斷機器大小端的兩種實現方法
大端模式 big endian 是指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址 中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 小端模式 little endian 是指資料的低位儲存在記憶體的低位址...
判斷機器大小端的兩種實現方法
大端模式 big endian 指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 小端模式 little endian 指資料的低位儲存在記憶體的低位址中,而...
判斷機器大小端的兩種實現方法
大端模式 big endian 指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 小端模式 little endian 指資料的低位儲存在記憶體的低位址中,而...