关于大端小端的概念,小端:数据的高位字节存放在高地址内,数据的低位字节存放在低地址内。
大端:数据的高位字节存放在低地址内,数据的低位字节存放在高地址内。
典型的体系结构中,一个字是4个字节,那么数据0x0A0B0C0D,在小端机器中从地址到高址的存放方式为:0x0D,0x0C,0x0B,0x0A;
在大端模式中从地址到高地址的存放方式为:0x0A,0xB,0x0C,0x0D;
通用处理器中,ARM通常是大端模式,x86体系机构是小端模式。
如果让你判断一个处理器的类型,你该如何编码实现呢,如果是用汇编语言,那这是一件非常容易的事情,向指定地址写一个数据,
再逐个字节的读出来,就能很容易判断出大小端。那么用C语言如何实现呢?
方法一、通过读取同一地址的整型数据和字符数据来区别大端和小端

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的共享内存特性,来判断机器类型

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的开发者,在内核中只用这样两句话,就判断了机器类型

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