嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址
0x4000
0x4001
存放内容
0x34
0x12
而在Big-endian模式CPU内存中的存放方式则为:
内存地址
0x4000
0x4001
存放内容
0x12
0x34
32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址
0x4000
0x4001
0x4002
0x4003
存放内容
0x78
0x56
0x34
0x12
而在Big-endian模式CPU内存中的存放方式则为:
内存地址
0x4000
0x4001
0x4002
0x4003
存放内容
0x12
0x34
0x56
0x78
联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性获得CPU对内存采用Little-endian还是Big-endian模式读写。
/*
采取对变量的地址取值方式进行判断大小端
*/
#include
#include
#include
int main(int argc, char **argv)
{
int i = 1;
char *cp = (char *)&i;
if (*cp) //如果此时cp指向的内存为1的话,则为小端,否则为大端。
printf("Little Endian\n");
else
printf("Big Endian\n");
return 0;
}
/*采取联合体的方法*/
#include
int main()
{
union ut
{
short s;
char c[2];
}u;
if(sizeof(short) == 2)
{
u.s = 0x0102;
if(u.c[0] == 1 && u.c[1] == 2)
{
printf("big enidan\n");
}
else if(u.c[0] == 2 && u.c[1] == 1)
{
printf("little endian.\n");
}
return 0;
}
}
联合体union的存放顺序是所有成员都从低地址开始存放,若处理器是Big_endian(从高字节到低字节存放数据)的,则低端地址u.c[0]对应高位值0x01;若是Little_endian(从低字节到高字节存放数据)的,则低端地址u.c[0]对应低位0x02.
阅读(2283) | 评论(0) | 转发(0) |