如何判断CPU字节序之[Big-endian vs Little-endian]

【本文链接】

http://www.cnblogs.com/hellogiser/p/big-endian-vs-little-endian.html

【Big-endian vs Little-endian】

  超过一个字节的数据在内存中会用几个字节存储,根据数据在内存的存放方式,分大端模式(Big-endian)和小端模式(Little-endian)。

  大端模式是将数据的高位存在内存的低位地址;小端模式而是将数据的高位存在内存的高位地址,以下是十六进制0x12345678在内存地址的两种存储方式(假设数据是按原码存储),0x12345678中,12是高位,78是低位。

        

对于Big-endian,其MSB(Most Significant Byte,最高有效字节)为0x12,其LSB (Least Significant Byte,最低有效字节)为0x78。

对于Little-endian,其MSB(Most Significant Byte,最高有效字节)为0x78,其LSB (Least Significant Byte,最低有效字节)为0x12。

从上面的例子可以看到,采用Big-endian方式存储数据是符合我们人类的思维习惯的。

谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。IBM, Motorola(Power PC), Sun的机器一般采用Big-endian方式存储数据。而x86系列则采用Little-endian方式存储数据。

【Why】

  为什么要注意字节序的问题?
  在单机环境里的程序不用考虑字节序(endian)的问题,因为字节序的不同是在不同单机环境里的,如果你要在不同单机之间传递数据,就要考虑字节序的问题,因为数据是按地址存取的,如果你是不同的字节序单机通信,就会导致传输数据”变异“,例如,把Little-endian环境的数据0x12345678的指针传递给Big-endian环境,数据就“变异”为0x78563412。
  所有网络协议也都是采用Big-endian的方式来传输数据的。所以有时我们也会把Big-endian方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。

【Code】

 C++ Code 
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
29
30
31
32
33
34
 
/*
    version: 1.0
    author: hellogiser
    blog: http://www.cnblogs.com/hellogiser
    date: 2014/7/10
*/


/*
 big-endian: return 1
 little-endian: return 0
*/

int checkEndianByInt()
{
    
int i = 0x12345678;
    
char *c = (char *)&i;
    
return(*c == 0x12);
}

/*
 big-endian: return 1
 little-endian: return 0
*/

int checkEndianByUnion()
{
    
union
    {
        
int a;// 4 bytes
        char b// 1 byte
    } u;

    u.a = 
1;
    
if (u.b == 1return 0;
    
else return 1;
}

【参考】

http://www.cnblogs.com/fengfenggirl/archive/2013/03/31/2992451.html

http://www.cnblogs.com/berry/articles/1588084.html

http://www.cnblogs.com/TsuiLei/archive/2008/10/29/1322504.html

http://blog.csdn.net/wyzxg/article/details/5349896

【本文链接】

http://www.cnblogs.com/hellogiser/p/big-endian-vs-little-endian.html