5

什么是大端序和小端序

给定一个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\n");
    }
    else {
        printf("big endian\n");
    }
    return 0;
}

原理是取整型数1的第一个字节。如果是小端序存放,即低位字节在前,那这个字节的值一定是1;否则是0。


jollywing
721 声望13 粉丝