如何判断一个机器是大端还是小端

 

    关于大端小端的概念,小端:数据的高位字节存放在高地址内,数据的低位字节存放在低地址内。

                                大端:数据的高位字节存放在低地址内,数据的低位字节存放在高地址内。

    典型的体系结构中,一个字是4个字节,那么数据0x0A0B0C0D,在小端机器中从地址到高址的存放方式为:0x0D,0x0C,0x0B,0x0A;

   在大端模式中从地址到高地址的存放方式为:0x0A,0xB,0x0C,0x0D;

   通用处理器中,ARM通常是大端模式,x86体系机构是小端模式。

   如果让你判断一个处理器的类型,你该如何编码实现呢,如果是用汇编语言,那这是一件非常容易的事情,向指定地址写一个数据,

   再逐个字节的读出来,就能很容易判断出大小端。那么用C语言如何实现呢?  

    方法一、通过读取同一地址的整型数据和字符数据来区别大端和小端    

View Code
 1  unsigned int data,* point;
 2     point=&data;//获取整型数据的地址,保存在point中
 3     data=0;
 4     *(type *) point= 0x22;
 5     if(data==0x22)
 6     {
 7         cout<< "此处理器是小端!"<<endl;
 8     }
 9     else  if(data==0x22000000)
10     {
11         cout<< "此处理器是大端!"<<endl;
12     }
13     else
14     {
15         cout<< "暂时无法判断机器类型!"<<endl;
16     }

 

 

    方法二、通过union的共享内存特性,来判断机器类型    

View Code
 1  union
 2     {
 3         char str;
 4         int data;
 5     };
 6     data=0x01020304;
 7     if(str==0x01)
 8     {
 9         cout<< "此机器是大端!"<<endl;
10     }
11     else if(str==0x04){
12         cout<<"此机器是小端!"<<endl;
13     }
14     else{
15         cout <<" 暂无法判断此机器类型!"<<endl;
16     }

 

 

    方法三、Linux的开发者,在内核中只用这样两句话,就判断了机器类型

View Code
1  static union { char c[4]; unsigned long mylong; } endian_test = {{ 'l', '?', '?', 'b' } };
2     #define ENDIANNESS ((char)endian_test.mylong)
3     cout<<ENDIANNESS<<endl;

 

 

posted @ 2013-04-24 13:33  醉剑客  阅读(4935)  评论(0编辑  收藏  举报