转自:http://www.cnblogs.com/flysnail/archive/2011/10/25/2223721.html
一、概述
字节序,又称端序,尾序,英文:Endianness。
在计算机科学领域中,字节序是指存放多字节数据的字节(byte)的顺序,典型的情况是整数在内存中的存放方式和网络传输的传输顺序。Endianness有时候也可以用指位序(bit)。
大小端序跟硬件的体系结构有关,所有x86系列的pc机都是小端序,跟操作系统无关。在x86系列的pc上的solaris系统是小端序,sun sparc平台的solaris是大端序。
大端字节序,高字节存于内存低地址,低字节存于内存高地址;小端字节序反之。
如一个long型数据0x12345678
大端字节序:
内存低地址--> 0x12
0x34
0x56
内存高地址--> 0x78
小端字节序:
内存低地址--> 0x78
0x56
0x34
内存高地址--> 0x12
二、大端序和小端序
大端序(英:big-endian)或称大尾序。
地址增长方向 → | |||||
... | 0x0A | 0x0B | 0x0C | 0x0D | ... |
示例中,最高有效位(MSB, Most Significant Byte)是0x0A 存储在最低的内存地址处。下一个字节0x0B存在后面的地址处。正类似于十六进制字节从左到右的阅读顺序。
数据以16bit为单位:
地址增长方向 → | |||||
... | 0x0A0B | 0x0C0D | ... |
|
|
最高的16bit单元0x0A0B存储在低位。
小端序(英:little-endian)或称小尾序。
地址增长方向 → | |||||
... | 0x0D | 0x0C | 0x0B | 0x0A | ... |
最低有效位(LSB,Least Significant Byte)是0x0D 存储在最低的内存地址处。后面字节依次存在后面的地址处。
数据以16bit为单位:
地址增长方向 → | |||||
... | 0x0C0D | 0x0A0B | ... |
|
|
最低的16bit单元0x0C0D存储在低位。
采用大端序的CPU和采用小端序的CPU不仅在字节上是相反的,在比特位上也是相反的。
比如0x01在内存中的存储
大端序:内存低比特位 00000001 内存高比特位
小端序:内存低比特位 10000000 内存高比特位
比如0x00000001
大端序:内存低比特位 00000000 00000000 00000000 00000001 内存高比特位
小端序:内存低比特位 10000000 00000000 00000000 00000000 内存高比特位
三、判定方法
typedef
struct
tagRegion{
unsigned
char
region1:1;
unsigned
char
region2:6;
unsigned
char
region3:1;
} REGION;
union
{
REGION bb;
unsigned
char
aa;
} cc;
int
main(
int
argc,
char
* argv[])
{
cc.bb.region1 =1;
printf
(
"Hello World! %d/n"
,cc.aa);
//打印1表示小端,打印128表示大端。
return
0;
}
|
static
unsigned
char
isBigEndian()
{
const
unsigned
short
test= 0xFF00;
return
*((unsigned
char
*) &test);
};
|
使用以下方式更简洁一些:
1 #include <iostream>
2 using namespace std;
3
4 int main(int argc, char **argv)
5 {
6 short s = 0x0102;
7 if((*(unsigned char*)&s) == 2)
8 cout<<"little endian"<<endl;
9 else if((*(unsigned char*)&s) == 1)
10 cout<<"big endian"<<endl;
11 else
12 cout<<"unknown endian\n"<<endl;
13
14 return 0;
15 }