簡介
1980年,Danny Cohen在其著名的論文" On Holy Wars and a Plea for Peace"中為平息一場關於位元組該以什麼樣的順序傳送的爭論而引用了該詞。
endian翻譯為“位元組序”,又稱 端序, 尾序。
在計算機科學領域中, 位元組序是指存放多位元組數據的位元組(byte)的順序,典型的情況是整數在記憶體中的存放方式和網路傳輸的傳輸順序。Endianness有時候也可以用指 位序(bit)。
一般而言,位元組序指示了一個UCS-2字元的哪個位元組存儲在低地址。如果LSByte在MSByte的前面,即LSB為低地址,則該位元組序是 小端序;反之則是 大端序。
在網路編程中,位元組序是一個必須被考慮的因素,因為不同的處理器體系可能採用不同的位元組序。
在多平台的代碼編程中,位元組序可能會導致難以察覺的bug。
BIG ENDIAN :最低位地址存放高位位元組,可稱高位優先,記憶體從最低地址開始按順序存放(高數位數字先寫)。最高位位元組放最前面。
LITTLE ENDIAN :最低位地址存放低位位元組,可稱低位優先,記憶體從最低地址開始按順序存放(低數位數字先寫)。最低位位元組放最前面。
Big Endian解釋
最低位地址存放高位位元組,可稱高位優先,記憶體從最低地址開始按順序存放(高數位數字先寫)。
最高位位元組放最前面。
例如“漢”字的Unicode編碼是6C49。如果將6C寫在前面,就是big endian。
還是將49寫在前面,就是little endian
Big Endian示例圖
對於單一的位元組( a byte),大部分處理器以相同的順序處理位元(bit),因此單位元組的存放方法和傳輸方式一般相同。
對於多位元組數據,如整數(32位機中一般占4位元組),在不同的處理器的存放方式主要有兩種,以記憶體中0x0A0B0C0D的存放方式為例,分別有以下幾種方式:
注: 0x前綴代表十六進制。
數據以8bit為單位:
地址增長方向 → | |||||
... | 0x0A | 0x0B | 0x0C | 0x0D | ... |
示例中,最高有效位(MSB, Most Significant Byte)是0x0A 存儲在最低的記憶體地址處。下一個位元組0x0B存在後面的地址處。正類似於十六進制位元組從左到右的閱讀順序。
數據以16bit為單位:
地址增長方向 → | |||
... | 0x0A0B | 0x0C0D | ... |
最高的16bit單元0x0A0B存儲在低位。
測試大端小端的C代碼:
#include<stdio.h>
int main()
{
unsigned int uiTest;
unsigned char *pucTmp = NULL;
uiTest = 0x12345678;
pucTmp = (unsigned char *)&uiTest; //指向&uiTest的第一個位元組
if(*pucTmp == 0x78)
{
printf("This is Little Endian\n");
}
else
{
printf("This is Big Endian\n");
}
return 0;
}