关于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/************************************************************************/

 5 BYTEORDER 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

 

 

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

转载于:https://www.cnblogs.com/homeofish/archive/2009/03/20/1417271.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值