Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1330558
  • 博文数量: 206
  • 博客积分: 10571
  • 博客等级: 上将
  • 技术积分: 2610
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-30 11:50
文章分类
文章存档

2014年(1)

2013年(4)

2012年(18)

2010年(14)

2009年(31)

2008年(3)

2007年(135)

分类: LINUX

2012-03-11 11:22:34

嵌入式系统开发者应该对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.


阅读(2244) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~