经常被忽视的字节顺序

         说起字节顺序,有些人可能会感到陌生,大多数程序员会认为机器相关的东西与自己似乎没太大关系,“操作系统、编译器和运行时环境不是已经给我们提供了很好的屏蔽吗?”话虽如此,但也不尽然,深入地了解一下概念还是很有好处的,如果你确实不知道是否从中受益,那么时间会告诉你。

         当我们要在内存中存储一个连续的字节序列时,比如4个字节吧,从地位字节到高位字节编号为0-3,我们知道内存是按地址排序的从零开始直到最大,那么我们这连续的四个字节到底如何存放在内存中呢??是高位字节在高地址低位字节低地址呢,还是按照相反的顺序,对于这个问题,很多芯片厂商曾一度存在争议,前一种方案,被叫做“小端”,后一种对应的叫“大端”,概念很简单,一说都明白,有什么用呢??

         对于大多数程序员来说,自己顺序是不可见的,可是在以下几种情况,你就必须明确这个概念,否则你将遇到麻烦。

        1、不同的机器通过网络传送二进制数据时,必须明确自己使用的是大端还是小端,因为在发送之前,要将你所用的字节序列转换成网络标准的字节顺序,然后在接收端将网络字节顺序转换成所在系统的字节顺序,如若不然,将不能进行有效通讯。

        2、对读取字节序列,也就是读取反汇编代码时,必须能够正确区分使用大端还是小端,确定机器指令。

        3、在编写以其他类型(不是原声明或者定义类型)去访问某类型变量时,我们就要知道原类型在内训中到底如何存放,采用的那种方式。比如:float a=3.14;我们定义了一个单精度浮点型数,初始化为3.14,如果我们想知道与a具有相同二进制位级表示的整数值是多少,我们可以通过:int b=*(int*)&a;现在我们还想知道,这个浮点数在内存中到底是怎么一个二进制位串序列,则可以通过这个函数,此时我们也必须明确字节顺序,否则就不知道该如何操作内存。常用函数,定义如下:

void show_bytes(unsigned char *start,int len)

{

     int i;

     for(i=0;i<len;i++)

      printf("%.2x\t",start[i]);

}

很常用的函数,可以帮助学习数字的机器表示,如果不知道具体类型或者变量的二进制表示,可调用!希望对有些人有用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值