什麼是大端序和小端序
給定一個32位整數0x1234abcd
,在記憶體裡是怎麼存放的呢?
假定存放這個整數的記憶體起始地址是0x0001,那麼記憶體中存放這個整數有兩個可能:
|0x0001|0x0002|0x0003|0x0004|
| 12 | 34 | ab | cd |
或者:
|0x0001|0x0002|0x0003|0x0004|
| cd | ab | 34 | 12 |
第一種情況是高位位元組在前,叫做大端序(big-endian)。
第二種情況是低位位元組在前,叫做小端序(little-endian)。
不同的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
");
}
else {
printf("big endian
");
}
return 0;
}
原理是取整型數1的第一個位元組。如果是小端序存放,即低位位元組在前,那這個位元組的值一定是1;否則是0。