一、大端與小端的概念
大端與小端是用來描述多字節數據在內存中的存放順序,即字節序。
- 大端(Big Endian)是指低地址端存放高位字節;
- 小端(Little Endian)是指低地址端存放低位字節。
舉一個例子,比如數字0x12 34 56 78在內存中的表示形式爲:
1.大端模式:
低地址 —————–> 高地址
0x12 | 0x34 | 0x56 | 0x78
2.小端模式:
低地址 ——————> 高地址
0x78 | 0x56 | 0x34 | 0x12
short int x;
char x0,x1;
x=0x1122;
x0=((char*)&x)[0]; //低地址單元
x1=((char*)&x)[1]; //高地址單元
Big Endian:符號位的判定固定爲第一個字節,容易判斷正負。
Little Endian:長度爲1,2,4字節的數,排列方式都是一樣的,數據類型轉換非常方便。
需要記住計算機是以字節爲存儲單位。
不同的CPU架構有不同的選擇,有的使用大端序存放整型、長整型;有的使用小端序存放整型、長整型。
x86架構的CPU都使用小端序,即低位字節放在前面。而POWER PC使用大端序。
一個整型數在網絡中傳輸時,也有字節排序的問題。這是個約定俗成的問題。網絡字節序就是big-endian,即排在前面的字節是高位字節。
二、如何判斷大端和小端
怎麼判斷自己使用的機器是大端序還是小端序呢?使用下面的C程序:
#include <stdio.h>
int main(int argc, char *argv[])
{
int i = 1;
char *p = (char*)&i;
if(p[0] == 1) {
printf("little endian\n");
}
else {
printf("big endian\n");
}
return 0;
}
原理是取整型數1的第一個字節。如果是小端序存放,即低位字節在前,那這個字節的值一定是1;否則是0。