Chinaunix首页 | 论坛 | 博客
  • 博客访问: 277256
  • 博文数量: 182
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1292
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-06 19:02
个人简介

让一切的准备都完美演出,让所有的努力都美好落幕

文章分类

全部博文(182)

文章存档

2016年(60)

2015年(122)

我的朋友

分类: C/C++

2016-03-26 22:47:59

版本1:
在ARM体系中,每个字单元包含4个字节单元或者两个半字单元。在字单元中,4个字节哪一个是高位字节,哪一个是低位字节则有两种不同的格式:big-endian和little-endian格式。在小端模式中,低位字节放在低地址,高位字节放在高地址;在大端模式中,低位字节放在高地址,高位字节放在低地址。
在C语言中,不同于结构体,共用体(联合体)中的几种不同类型的变量存放在同一段内存单元中。利用这一特点,可以用联合体变量判断ARM或x86环境下,存储系统是是大端还是小端模式。

#include "stdio.h"
int main()
{
  union w
{
  int a;  //4 bytes
  char b; //1 byte
} c;
  c.a=1;
  if (c.b==1)
  printf("It is Little_endian!/n");
  else
  printf("It is Big_endian!/n");
  return 1;
}
说明:
1  在c中,联合体(共用体)的数据成员都是从低地址开始存放。
2  若是小端模式,由低地址到高地址c.a存放为0x01 00 00 00,c.b被赋值为0x01;


  ————————————————————————————


   地址 0x00000000 0x00000001 0x00000002 0x00000003


   c.a  01         00         00         00


   c.b  01         00        


  ————————————————————————————  
3  若是大端模式,由低地址到高地址c.a存放为0x00 00 00 01,c.b被赋值为0x0;


  ———————————————————————————— 


   地址 0x00000000 0x00000001 0x00000002 0x00000003


   c.a  00         00         00         01


   c.b  00         00                 


  ————————————————————————————  

4  根据c.b的值的情况就可以判断cpu的模式了,现在XP环境下的intel CPU是小端模式,不信你可测试下

版本2:
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
解答: 
int checkCPU() 

   
      union w 
       {   
           int  a; 
           char b; 
       } c;




    c.a = 1;




   return (c.b == 1); 
  


剖析: 
嵌入式系统开发者应该对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模式读写。
在linux中也是用类似的方法来判断的,在源码中可以找的到
阅读(1281) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~