1. 什麼是大端,什麼是小端:
所謂的大端模式,是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中;
所謂的小端模式,是指資料的低位儲存在記憶體的低位址中,而資料的高位儲存在記憶體的高位址中。(大部分的作業系統都是小端,而通訊協定是大端)
2.為什麼會有大小端:
為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為機關的,每個位址單元都對應着一個位元組,一個位元組為8bit。但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對于位數大于8位的處理器,例如16位或者32位的處理器,由于寄存器寬度大于一個位元組,那麼必然存在着一個如果将多個位元組安排的問題。是以就導緻了大端存儲模式和小端存儲模式。例如一個16bit的short型x,在記憶體中的位址為0x0010,x的值為0x1122,那麼0x11為高位元組,0x22為低位元組。對于大端模式,就将0x11放在低位址中,即0x0010中,0x22放在高位址中,即0x0011中。小端模式,剛好相反。我們常用的X86結構是小端模式,而KEIL C51則為大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬體來選擇是大端模式還是小端模式。
3.大小端在記憶體中的存放方式舉例:
16bit寬的數0x1234在Little-endian模式(以及Big-endian模式)CPU記憶體中的存放方式(假設從位址0x4000開始存放)為:
記憶體位址 | 小端模式存放内容 | 大端模式存放内容 |
0x4000 | 0x34 | 0x12 |
0x4001 |
32bit寬的數0x12345678在Little-endian模式以及Big-endian模式)CPU記憶體中的存放方式(假設從位址0x4000開始存放)為:
0x78 | ||
0x56 | ||
0x4002 | ||
0x4003 |
可以看出來小端模式,讀取記憶體就可以得到相應數字,無需調整結構,而大端需要調整結構,但是大端可以最先讀到正負符号,快速得知該數字是正數還是負數。
驗證一下~:
#include <iostream>
using namespace std;
void IsBigEndian()
{
int a = 0x1234;
char b = *(char *)&a; //通過将int強制類型轉換成char單位元組,通過判斷起始存儲位置。即等于 取b等于a的低位址部分
if( b == 0x12)
{
cout<<"big endian"<<endl;
return;
}
cout<<"small endian"<<endl;
return;
}
int main()
{
IsBigEndian();
}
