Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1792274
  • 博文数量: 306
  • 博客积分: 3133
  • 博客等级: 中校
  • 技术积分: 3932
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-19 16:50
文章分类

全部博文(306)

文章存档

2018年(7)

2017年(18)

2016年(39)

2015年(35)

2014年(52)

2013年(39)

2012年(22)

2011年(29)

2010年(53)

2009年(12)

分类: 嵌入式

2010-05-11 09:44:47

嵌入式系统开发者应该对Little-endianBig-endian模式非常了解。例 如,16bit宽的数0x1234Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址

0x4000

0x4001

存放内容

0x34

0x12

而在Big-endian模 式CPU内存中的存放方式则为:

内存地址

0x4000

0x4001

存放内容

0x12

0x34

有时候,用C语言写程序时需要知道是大端模式还是小端模式。 所谓的大端模式, 是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内 存的高地址中。为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在 C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例 如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如 一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式, 就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而 KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还 是小端模式。
下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式:
short int x;

char x0,x1;

x=0x1122;

x0=((char*)&x)[0]; //低地址单元
x1=((char*)&x)[1]; //高地址单元

若x0=0x11,则是大端; 若x0=0x22,则是小端......

int main()
{
short int x;

char x0,x1;

x=0*((char*)&x);
//低地址单元 ,或者((char*)&x)[0];

x1=*((char*)&x + 1);
//高地址单元,或者((char*)&x)[1];

printf("%x\n%x\n",x0,x1);
}

int checkCPU( )
{
    {
           union w
           {      int a;
                  short b;
           } c;
            c.a = 0x12345678;
           return(c.b == 0x5678);
    }
}
int main()
{
    printf("%d\n",checkCPU());
}




union w
{
     int a;

     char x[4];
}b;


int main()

{

      b.a = 0x12345678;

      printf("%x:%x\t %x:%x\t %x:%x\t %x:%x\n",&b.x[0], b.x[0], &b.x[1],b.x[1],&b.x[2],b.x[2], &b.x[3],b.x[3]);

}

输出(小端):80496b8:78 80486b9:56 80496ba:34  80596bb:12
阅读(1305) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~