我们知道在计算机中数据是以二进制来存储的。最常见的计量存储单位大小的是字节。那么什么是字节序呢?

字节序,又称端序尾序英语Endianness)。在计算机科学领域中,字节序是指存放多字节数据的字节(byte)的顺序,典型的情况是整数在内存中的存放方式和网络传输的传输顺序。Endianness有时候也可以用指位序(bit)。

一般而言,字节序指示了一个UCS-2字符的哪个字节存储在低地址。如果LSByteMSByte的前面,即LSB为低地址,则该字节序是小端序;反之则是大端序。在网络编程中,字节序是一个必须被考虑的因素,因为不同的处理器体系可能采用不同的字节序。在多平台的代码编程中,字节序可能会导致难以察觉的bug

由上面的描述我们知道字节序是很重要的,那么怎么检测你机器上使用的是大端序还是小端序呢?

我们先看看大、小端序的详细定义。

大端序Big-Endian.svg

示例中,最高有效位(MSB, Most Significant Byte)是0x0A 存储在最低的内存地址处。下一个字节0x0B存在后面的地址处。正类似于十六进制字节从左到右的阅读顺序。

 

 

小端序

Little-Endian.svg

最低有效位(LSB,Least Significant Byte)是0x0D 存储在最低的内存地址处。后面字节依次存在后面的地址处。

 

 

 

 

下面我写了一个简单的C程序来判断你机器是使用大端序还是小端序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
 
#define BIG 0x02
#define SMALL 0x01
 
int main()
{
    union testData{
        char c;
        int i;
    };
    testData test;
    //输出变量test、i、c的地址 看看是不是一样的
    printf("test:%x\ni:%x\nc:%x\n",&test,&test.i,&test.c);
 
    //将高字节为0x02 低字节为0x01的数字存入test的i中
    test.i = 0x0201;
 
    if(SMALL & test.c)
        printf("机器采用小端序\n");
    else
    if(BIG & test.c)
        printf("机器采用大端序\n");
    else
        printf("天知道机器是什么字节序\n");
 
    return 0;
}

代码定义了一个union变量,里面包含了一个1字节的char变量c,一个2字节的int变量i。整个结构体的大小的2个字节。通过将 0×0201赋值给test的int部分i,然后检查它的低地址即char部分的c(为什么?看看union变量)。如果c中保存的是0×02则代表机器 使用大端序,如果保存的是0×01则代表机器使用小端序。

参考资料:http://zh.wikipedia.org/zh/%E5%AD%97%E8%8A%82%E5%BA%8F#.E5.A4.A7.E7.AB.AF.E5.BA.8F
(全文完)

更多新手学习C语言的博文请关注:http://dabentu.com/1188.html