判断CPU是大端还是小端

一、什么是大端 Or 小端?

    在直接对内存操作的时候,知道所使用CPU存放数据顺序是非常重要的,尤其是存取网络数据的时候。一般有两种顺序 Big endian(大端模式),一种是Little endian(小端模式)。大端模式就是将一个数据的低字节数据放在内存中的高地址中;小端模式与之相反是将低字节数据放在内存的低地址中。比如,一个数据0x1234,存放在起始地址为0x0000的内存中,其中0x34是低字节数据,0x12是高字节数据,

如果是大端模式,存放顺序为:

 0x0000  0x0001

 0x12    0x34

小端模式存放顺序为:

 0x0000  0x0001

 0x34    0x12

    一般说来,x86的cpu都是小端模式,PowerPC都是大端模式,而有的CPU可以通过设置来确定是工作于大端还是小端模式。那么,怎么确定一个系统是大端模式,还是小端模式呢?


二、如何判断大端 Or 小端 ?

    一般有两种方法,其一,就像上文所描述的顺序一样,我们把一个数据0x1234赋值给一个unsigned int 类型变量temp,这个temp变量有两个字节数据存放在相应的两个内存地址中,然后,我们把temp变量的首地址赋值给一个char 类型的变量,在读取这个char变量,看看这个char变量的值是0x12还是0x34,这样不就很容易的判断出是大端还是小端模式了么?如果是0x34那么无疑是小端模式,如果是0x12那么就是大端模式。

  验证代码如下:

#include

int main()

{

    unsigned int temp =0x1234;

    char *p =NULL;

    p =(char *) &temp;

    if(*p == 0x12)

    {

        printf(" It is Big-endian \n");

    }

    else if(*p ==0x34)

    {

        printf("It is Little-endian\n");

    }

    return 0;

}

其二,利用union数据类型的特性,我们都知道union中的数据是从低地址向高地址存放的,而且其数据成员是共享内存的,也即是,如果还有两个数据成员,一个int类型,一个char类型,它们是存放在同一个内存地址的。那么我们可以进行如下验证:

    

#include

int main()

{

    printf("使用union数据类型,验证系统的模式 !\n");

    union endian

    {

        int a;

        char b;

    }temp;


    temp.a = 0x1234;

    printf("temp.b = %x\n",temp.b);

    if(temp.b ==0x34)

        printf("It is Little-endian !\n");

    else

        printf("It is Big-endian !\n");

    return 0;

}


你可能感兴趣的:(操作系统)