判断大小端模式:联合/强制类型转换

数据0XF432:

----小端模式:x86的cpu在内存中存储的是0x32, 0xF4

----大端模式:一些RISC架构的处理器在内存中存储的是0xF4, 0x32


方法1:利用联合的特点。联合中的数据成员是共享存储空间的,所分配的空间为数据成员最大所需的内存数。程序定义了endian_un的联合体,其中包含两个数据成员,一个是short类型的数据成员var(32位系统为2字节),一个是字符类型的字符数组bits,字符数组的元素个数为short类型的字节数。

程序将var赋值为0x0102,由于联合结构的特点,bits字符串数组中同样存储了0x0102这一数值。通过判断字符串中的低位和高位存储的内容,就可以知道系统是little-endian还是big-endian的

方法2:通过强制类型转换。程序中通过取flag变量的地址,获得起始空间的存储内容。如果起始空间存储的是数据的低位内容,则为little-endian,否则为big-endian

#include 

int is_little_endian(void){
    unsigned short flag = 0x4321;

    if(*(char*)&flag == 0x21){
        return 1;
    else
        return 0;
}

int main(void){
   union endian_un{
        short var;
        char bits[sizeof(short)];
    };
    flag.var = 0x0102;
    if(sizorf(short) == 2){
        if(flag.bits[0] == 1 && flag.bits[1] == 2)
              printf("judged by first method,little_endian\n");
        if(flag.bits[0] == 2 && flag.bits[1] == 1)
                printf("judged by first method, big_endian\n");
      }

      if(is_little_endian())
           printf("judged by second method, little_endian\n");
      else
           printf("judged by second method , big_endian\n");
       return 0;
    
}


网络中的传送的数据都是大端模式

linux提供了htons,htonl,ntohl,ntohl四个函数用于转换

你可能感兴趣的:(C/C++)