Chinaunix首页 | 论坛 | 博客
  • 博客访问: 139828
  • 博文数量: 38
  • 博客积分: 306
  • 博客等级: 二等列兵
  • 技术积分: 335
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-29 15:19
文章分类

全部博文(38)

文章存档

2013年(23)

2012年(15)

我的朋友

分类: C/C++

2012-11-10 16:04:47

  采用小端模式的CPU对操作数的存放方式是从低字节到高字节
     大端模式对操作数的存放方式是从高字节到低字节。也就是说大端模式符合人的习惯,而小端更加方便计算机操作。
    32bit宽的数0x12345678在小端模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
     内存地址 0x4000 0x4001 0x4002 0x4003
     存放内容 0x78 0x56 0x34 0x12

 而在大端模式CPU内存中的存放方式则为:
    内存地址 0x4000 0x4001 0x4002 0x4003
    存放内容 0x12 0x34 0x56 0x78

若判断处理器是Big还是Little模式,有两种方法

1、

    int i=1;  
    char *p=(char *)&i;  
    if(*p==1)    
           printf("1"); 
    else
           printf("2");

          大小端存储问题,如果小端方式(i占至少两个字节的长度)则i所分配的内存最小地址那个字节中就存着1,其他字节是0.大端的话则1在i的最高地址字节处存放,char是一个字节,所以强制将char型量p指向i则p指向的一定是i的最低地址,那么就可以判断p中的值是不是1来确定是不是小端

2、

void checkCPU( )

{

           union w

           { 

                  int a;

                  char b;

           } c;

           c.a = 1;

           printf("%d\n",c.b);

}

union分配的内存按照int分配4个字节,如果是小端模式则存放的方式为                                                                                                      

地址A
------------------------------------
|A       |A+1   |A+2    |A+3 | int a;
|0x01 |0x00   |0x00   |0x00 |
-------------------------------------
|A      |char b;
|          |
---------        

如果是大端如何存储c.a的呢?   

地址A

------------------------------------------
|A          |A+1    |A+2      |A+3      |int a;
|0x00   |0x00   |0x00    |0x01    |
------------------------------------------
|A       |char b;
|            |
---------     

因此我们就可以通过查看char b==1?来判断大小端了。

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