当前的存储器,多以byte为访问的最小单元,当一个逻辑上的地址必须分割为物理上的若干单元时就存在了先放谁后放谁的问题,于是端(endian)的问题应运而生了,对于不同的存储方法,就有大端(big-endian)和小端(little- endian)两个描述。
大端与小端(MSB/LSB)
假设内存位置
0x4000 : 0x12
0x4001 : 0x34
表示值0x1234,那么这种方式为MSB, 即大端存储方式。
假设内存位置
0x4000 : 0x34
0x4001 : 0x12
表示值0x1234, 那么这种方式为LSB, 即小端存储方式。
简单来讲:MSB在低地址,即大端(MSB)存储。LSB在低地址,即小端(LSB)存储。
现在主流的CPU,intel系列的是采用的little endian的格式存放数据,而motorola系列的CPU采用的是big endian,ARM则同时支持 big和little,网络编程中,TCP/IP统一采用大端方式传送数据,所以有时我们也会把大端方式称之为网络字节序。
特别需要注意的是,C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而JAVA编写的程序则唯一采用big endian方式来存储数据。这里我就只讨论C/C++语言的情况。
方式一:bool isMSB()
{
/* true returned if MSB */
int iVal = 0x12345678;
char *pCh = (char*)&iVal;
return (*pCh == 0x12);
}
bool isLSB()
{
/* true returned if LSB */
int i = 0x12345678;
char *c = (char*)&i;
return (*c == 0x78);
}
方式二:
bool checkEnd()
{
/* true returned if LSB */
union
{
long a;
char b;
} u;
u.a = 1;
return (u.b == 1);
}
测试代码:
void main()
{
cout<<"Big End: "<<isMSB()<<endl;
cout<<"Litte End: "<<checkEnd()<<endl;
int i = 0x01020304;
char *c = (char*)&i;
printf("%d %d %d %d\n",*c,*(c+1),*(c+2),*(c+3));
}
测试输出:
Big End: 0
Litte End: 1
4 3 2 1
1,http://www.cnblogs.com/Romi/archive/2012/01/10/2318551.html
2,http://www.cnblogs.com/berry/articles/1588084.html