字节序判断

//小端字节序:低字节在低地址中,高字节在高地址中。这种字节序又称为主机字节序,intel的cpu使用的就是这种字节序。
//大端字节序:低字节在高地址中,高字节在低地址中。这种字节序又称为网络字节序,socket传输时就需要使用这种字节序。
#include
#include

int main() {
  if (__BYTE_ORDER == __LITTLE_ENDIAN) {
    printf("little endian!\n");
  } else if (__BYTE_ORDER == __BIG_ENDIAN) {
    printf("big endian!\n");
  } else {
    printf("unknown endian!\n");
  }

  return 0;
}


下面代码示范了两种检测系统字节序的方法。


第一种方法,使用强制类型转换的方式。C 语言在把占用2个字节的 short 变量强制转换为 char 之后,会把 short 变量的首地址赋给 char 变量,可以根据 char 变量的值判断系统字节序是 大端 还是 小端。

第二种方法,利用 联合类型 的特性。联合类型 共享同一段内存,首地址是相同的。

/*******************
  * 文件名:endian.c
  ******************/
#include
 
/*********************************************************
  * 使用类型的强制转换实现little-endian与big-endian的判断
  *********************************************************
  * 返回值:                                             
  *          1 表示是小端字节序。                        
  *          0 表示不是小端字节序。                      
  *********************************************************/
int is_little_endian_a( void )
{
     unsigned short flag = 0x4321;
     if (*(unsigned char *)&flag == 0x21)
         return 1;
     else
         return 0;
}
 
/*********************************************************************************
  * 利用联合的特点来判断little-endian与big-endian
  *********************************************************************************
  * 返回值:
  *          1   表示是小端字节序。
  *          0   表示是大端字节序。
  *          -1  表示不能使用这种方法确定字节序。比如有的机器的 short 长度不是 2 。
  ********************************************************************************/
int is_little_endian_b( void )
{
     union endian_un{
         short var;
         char bits[ sizeof ( short )];
     };
 
     union endian_un flag;
     flag.var=0x0102;
 
     //判断低位和高位的存储内容,确定是何种方式
     if ( sizeof ( short ) == 2){
         if (flag.bits[0] == 1 && flag.bits[1] == 2)
             return 0;
         else if (flag.bits[0] == 2 && flag.bits[1] == 1)
             return 1;
         else
             return -1;
     }
     
     return -1;
}
 
int main( void )
{
     int type = 0;
 
     type = is_little_endian_a();
     if (1 == type)
         printf ( "judged by first method, little-endian\n" );
     else if (0 == type)
         printf ( "judged by first method, big-endian\n" );
 
     type = is_little_endian_b();
     if (1 == type)
         printf ( "judged by second method, little-endian\n" );
     else if (0 == type)
         printf ( "judged by second method, big-endian\n" );
     else
         printf ( "can't judge it\n" );
 
     return 0;
}


你可能感兴趣的:(基础知识)