加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

判断大小端的方法

(2017-10-13 11:22:56)
分类: my_work

大端模式(Big-endian):

是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;

小端模式(Little-endian):

是指数据的低位保存在内存的低地址中,而数 据的高位保存在内存的高地址中,和我们的逻辑方法一致。


判断大小端方法:1、利用指针强制类型转换; 2、利用共用体所有数据共用同一块地址空间     3、直接判断法  


1、利用指针强制类型转换

 

[cpp] view plain copy
  1. #include  
  2. int main()  
  3.  
  4.     int 1;  
  5.     char (char*)&a;  
  6.     if (*p == 1)  
  7.      
  8.         printf("little-endian");  
  9.      
  10.     else  
  11.      
  12.         printf("big-endian");  
  13.      
  14.     return 0;  
  15.  

 

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

2、利用共用体所有数据共用同一块地址空间


 

[cpp] view plain copy
  1. #include  
  2. union  
  3.  
  4.     char c;  
  5.     int  a;  
  6. }A;  
  7. int main()  
  8.  
  9.     A.a= 1;  
  10.     if (A.c == 1)  
  11.      
  12.         printf("little-endian");  
  13.      
  14.     else  
  15.      
  16.         printf("big-endian");  
  17.      
  18.     return 0;  
  19.  
 联合体union的存放顺序是所有成员都从低地址开始存放,所以很容易就判别出机器的大小端了。 ^_^

3、直接判断法 
第三种称之为直接判断法,怎么直接判断呢,其实就是根据大小端各自的存储方式编写程序进行判断,这个方法更直接。

首先我们来看下大小端的存储方式:

大端模式(Big_endian)   -- 字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。

小端模式(Little_endian)-- 字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。

根据这个特性,假设我们初始化了一个int变量i为0x12345678,其地址为0x100,根据定义在小端模式下

0x100一个字节内的值为0x78,类推0x101=>0x56,0x102=>0x34,0x103=0x12,根据这个编程如下

  1. int
     checkSystem2(void 
  2.  
  3.     int 0x12345678 
  4.     char *c &i;  
  5.     return ((c[0== 0x78&& (c[1== 0x56&& (c[2== 0x34&& (c[3== 0x12));  
  6.  

 

[java] view plain copy
  1. int main(void 
  2. {  
  3.     if(checkSystem2())  
  4.         printf("little endian\n");  
  5.     else  
  6.         printf("big endian\n");  
  7.   
  8.     return 0 
  9.  

 

如果返回1表示小端,反则表示大端;


我曾经在面试中被问及该问题,当时我用的是第一种方法,用口述方式进行的,我还没陈述完,面试官就笑着说看来你是在网上看到了这样的方法,自己的理解不够深入! 他的话其实有点武断,用第一种方法并不表明我就没有深入理解大小端。

但是人都有主观判断性,面试官对我主观的印象就这样了!

所以以后面试还被问到就用第二种方法吧,这个描述起来,对方替听起来你总算是理解了大小端的本质就是存储方式!

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有