关于大小端的疑问

      看了多篇关于bigendian和littleendian的解释文章,觉得都说的不够彻底。现记录几点说的不清楚的地方,以作备忘。

      首先明确大小端是与cpu相关的,而非系统平台相关的。intelX86为小端。

      其次大小端对位移操作没影响。不管大小端,左移都是消高位,右移都是消低位。因为位移操作汇编出来都只有一句:

         SHL/SHR   COUNT,其实现由cpu制造商自己去处理。来满足位移定义,不需要程序员操心。

      看下面的测试大小端的程序用例:

         int a=1;

         char b=*((char*)&a);

         若b为1,则为小端,否则大端。

         在我的机器上结果为1,结论正确。

 

     这里忽略了一个假设,那就是,假设程序可用存储空间从0x00ff43c0处开始,那么当分配了4个字节给a后,

     &a取到得地址是0x00ff43c0还是0x00ff43c4?显然我们基于的假设是0x00ff43c0。那就是整数和数组一样,也是从低往高分配。

         我们来看一下上面代码的汇编实现(基于80x86系列):

               int a=1;
               00412FE8  mov         dword ptr [ebp-0Ch],1
               char b=*((char*)&a);
               00412FEF  mov         al,byte ptr [ebp-0Ch]
               00412FF2  mov         byte ptr [ebp-15h],al

     上面的代码是x86系列的指令集,首先将1赋值给a,a可以理解为地址符,值为DS:[EBP-0CH],上面用到了类型说明,类似于强制类型转换,指明该地址指向的是双字类型。紧接着下面又将a解释为指向单字节的地址。然后将单字节内的数据送到AL,然后从AL送到b指向的地址。这里的2次类型说明无法确定上面的假设是哪一种。但我们可以从结论反推出内存的分配顺序:整数从低到高。我以前一直误以为是从高到低分配的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值