关于CPU的字节顺序

     点击此处下载代码

     今天遇到字节序的问题,决定把这个问题搞清楚。

      字节序就讲的是占用多个字节的数据类型(int,long等)在内存中的存放顺序,比如一个int型,大小为109486163(为什么要用这个数举例?往下看就知道 了),用16进制的形式表示就是0x41424344,这个数在内存中是如何存放的呢,假设其址为0,这个int分配的地址也为0,那么,在地址0,1,2,3,上的值分别是多少?但愿这篇文章可以回答这个问题。

      字节序通常有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;也就是低地址存放最低有效字节(LSB)。大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。也就是是指低地址存放最高有效字节(MSB)

    下图显示了数据的0x41424344在两种字节顺序中的排列:

image

        大端字节顺序

 

image

     小端字节顺序

 

 

     基于X86平台的PC机是小端字节序的,而有的嵌入式平台则是大端字节序的。JAVA字节序也是(大端字节序)BIG-ENDIAN。

    下面用一个小程序来看看Intel使用的是是不是小端字节序(如果不是,那9成[留条后路先]是程序错了)。

    动态判断CPU字节序列:

    

 1/************************************************************************
 2函数功能: 动态判断字节顺序
 3返回值  : 见枚举BYTEORDER定义
 4/************************************************************************/

 5BYTEORDER GetByteOrder()
 6{
 7    BYTEORDER eByteOrder = BO_UNKNOWN;
 8    union
 9    {
10        unsigned short int s;
11        unsigned char arr[sizeof (unsigned short int)];
12    }
un;
13    un.s = 0x1234;
14
15    if ( 0x12 == un.arr[0&& 0x34 == un.arr[1])
16    {
17        eByteOrder = BO_BIG_ENDIAN;
18    }

19    else if ( 0x34 == un.arr[0&& 0x12 == un.arr[1])
20    {
21        eByteOrder = BO_LITTLE_ENDIAN;
22    }

23    else
24    {
25        eByteOrder = BO_UNKNOWN;
26    }

27    return eByteOrder;
28}

 

    还记得一开始那个int值吗,现在我们要把这个int分解成4个char,分别是ABCD,并输出。如下图所示。程序就不贴了,需要请在附件中下载。

image

 

 

更多内容,您可以移步这里

posted @ 2009-03-20 00:20  新起点_不能用  阅读(2067)  评论(0编辑  收藏  举报