首先我們需要知道,數據是可以存放在内存中的。在計算機系統中,内存的最小存放單元是字節,即一個地址對應一個字節,可以保存一個字節(8Bit)的數據,但是在計算機系統中又不可能全部都是一個字節的存儲方式,還有一些8位、16位、32位的系統,它們還會有2個字節、4個字節的變量。所以就有了數據在内存中存放順序的說法,也就是大小端的由來。
下面舉個例子說明一下大小端的原理。
比如現在有一個由2個字節組成的16位整數0x1234,那麼它在内存中存放的方式就有:
(1) 将高字節0x12存放在高地址的位置,而将低字節0x34存放在低地址的位置;
(2) 将高字節0x12存放在低地址的位置,而将低字節0x34存放在高地址的位置;
(1)、(2)的演示如下圖所示:
在上圖中,(1)的存放方式就是小端,(2)的存放方式就是大端。
再比如,現有一32位int型數0x12345678,假設其MSB(Most Significant Byte,最高有效字節)為0x12,其LSB (Least Significant Byte,最低有效字節)為0x78,在CPU内存中有兩種存放方式,如下:
綜上所述,總而言之:
大端:是高字節數據存放到内存的低地址,低字節數據存放在内存的高地址;
小端:是高字節數據存放到内存的高地址,低字節數據存放在内存的低地址;
當我們在寫代碼的時候,不知道當前環境是用大端模式還是小端模式時,有時候我們使用一些數據結構的時候,在賦值的時候就會導緻賦值出錯,所以需要檢測當前系統的大小端,方便我們寫代碼的時候安排數據結構的寫法。
對于大小端的判斷,當你知道了大小端的原理之後,其實就很簡單去驗證了,寫個代碼段就可以測試出來。
我個人覺得判斷大小端最簡單的辦法是利用共用體的共享内存空間的機制進行判斷,另外用指針也是很方便的,這兩者大同小異,分别如下:
(1)使用共用體
typedef union
{
int a;
char b;
}test;
// 給a賦值
test.a = 0x12345678
// 判斷b的值
print(test.b) // 如果test.b=0x12說明是大端,如果test.b=0x78說明是小端
(2)使用指針的方式
int a = 0x12345678;
char *b = (char *)(&a); // 指針方式其實和共用體的本質很像
if(0x78 == *b)
小端模式;
else if(0x12 == *b)
大端模式;
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!