笔试面试7如何判断一个系统的存储方式是大端还是小端


 

笔试面试7如何判断一个系统的存储方式是大端还是小端

 

首先看下大小端的概念吧,我老是会有点乱…

来自百度百科的解释:

 

大端模式,是指数据的高位保存在内存的低地址中,而数据的低位保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
小端模式,是指数据的高位保存在内存的高地址中,而数据的低位保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。

 

简单来说,从内存地址增加的方向来说,大端就是先存放高序字节,小端就是先存放低序字节。

 

例如:0x0102

——–>内存增加的方向——>

地址A——>地址A+1

大端:01    02

小端:02      01

 

判断方法是利用union的一个特性,那就是里面的变量共享一段内存

可以定义一个union.

union  Test{

short num;//2byte

char c[sizeof(num)];//2byte

} ;

然后存入一个0x0102或者其他数字到test.num中,因为共享内存的原因,可以访问c[1],c[2],查看里面的值来判断大小端。

一个实现是(参照unix网络编程中的一个例子):

 

#include <stdio.h>
#include <conio.h>
union Test{
	  short num;
	  char c[sizeof(short)];
};
int main()
{
 	union Test t;//C++ 直接声明为Test t即可 
    t.num=0x0102;
	if(t.c[0]==1&&t.c[1]==2)
		printf("大端!\n");
	else if(t.c[0]==2&&t.c[1]==1) 	 	
		printf("小端!\n");	
	else
		printf("未知!\n");
	getch(); 
	return 0;
	 
}

在Win7 32bit里面用DEV c++运行的结果为:

或者更简单的是存一个short值,然后取其地址。

 

#include <stdio.h>
#include <conio.h>
int main()
{
 	short int num=0x0201;
 	 char *p=(char*)&num; //感谢 花间物语 网友指出的错误
 	
	if(*p==0x02)
		printf("大端!\n");
	else if(*p==0x01) 	 	
		printf("小端!\n");	
	else
		printf("未知!\n");
	getch(); 
	return 0;
	 
}

测试结果:

 

 

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

//写的错误或者不好的地方请多多指导,可以在下面留言或者点击左上方邮件地址给我发邮件,指出我的错误以及不足,以便我修改,更好的分享给大家,谢谢。

转载请注明出处:http://blog.csdn.net/qq844352155

author:天下无双

Email:coderguang@gmail.com

2014-11-6

于GDUT

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

 

 

 

 


《 “笔试面试7如何判断一个系统的存储方式是大端还是小端” 》 有 3 条评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注