CSAPP---大小端字节序判断方法

之前在看《UNIX网络编程》这本书时有提到一种方法,利用union的性质,代码如下

#include<stdio.h>
int main()
{
    union
    {
        short value;
        char union_bytes[sizeof(short)];
    }test;
    test.value=0x0102;

    //低位地址存放高位数据则为大端字节序
    if((test.union_bytes[0]==1)&&(test.union_bytes[1]==2))
    {
        printf("big endian
");
    }
    //小端字节序
    else if((test.union_bytes[0]==2)&&(test.union_bytes[1]==1))
    {
        printf("little endian
");
    }
    else
    {
        printf("unknown...
");
    }
}

在看CSAP时发现了另外一种方法,首先在C语言中一个指针,无论它指向哪种数据类型,它的值都是某个存储块的第一个字节的虚拟地址,例如一个int占4个字节,则int指针的值就是第一个字节的地址,如果把int指针强制转换为char指针,然后解引用则得到第一个字节中存放的数据,代码如下

#include <stdio.h>
 #include <unistd.h>
 
 typedef unsigned char *byte_pointer;
 
 void show_bytes (byte_pointer start, int len)
 {
    int i;
    for (i = 0; i < len; i++)
       printf (" %.2x", start[i]);
    printf ("
");
 }
 
 void show_int (int x)
 {
    show_bytes ((byte_pointer) &x, sizeof(int));
 }
 
//错误示例,int*指针解引用直接得到4个字节也就是整个int的数据
 void show_int_bytes( int *start, int len)
 {
    int i;
    for (i = 0; i < len; i++)
       printf (" %.2x", start[i]);
    printf ("
");
 }

 int main()
 {  
   int a = 0x01020304;
   show_int(a);
   return 0;
 }

如果输出结果为:04 03 02 01则为小端字节序

经验分享 程序员 微信小程序 职场和发展