大端格式:
在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。
小端格式:
与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。
判断CPU是大端格式还是小端格式,程序见下:(变量名存储的是低地址)
#include <iostream>
using namespace std;
int main(void)
{
int s=0x12345678;
int a[2]={0};
cout<<&a[0]<<endl<<&a[1]<<endl;
if(*(char*)&s==0x12)
cout<<"big endian"<<endl;
else if(*(char*)&s==0x78)
cout<<"little endian"<<endl;
}
using namespace std;
int main(void)
{
int s=0x12345678;
int a[2]={0};
cout<<&a[0]<<endl<<&a[1]<<endl;
if(*(char*)&s==0x12)
cout<<"big endian"<<endl;
else if(*(char*)&s==0x78)
cout<<"little endian"<<endl;
}
嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址 |
0x4000 |
0x4001 |
存放内容 |
0x34 |
0x12 |
而在Big-endian模式CPU内存中的存放方式则为:
内存地址 |
0x4000 |
0x4001 |
存放内容 |
0x12 |
0x34 |
大端、小端互换,程序见下:
unsigned short exchange(byte* data)
{
unsigned short ret;
byte tmp[2];
tmp[0]=data[1];
tmp[1]=data[0];
memcpy(&ret,tmp,sizeof(tmp));
return ret;
}
{
unsigned short ret;
byte tmp[2];
tmp[0]=data[1];
tmp[1]=data[0];
memcpy(&ret,tmp,sizeof(tmp));
return ret;
}