对于字节顺序——大端与小端的理解

之前我对大小端的理解是数据存放方式不同,最近在读《计算机组成-结构化方法》一书时发现,并不是存放方式不同,而是字节地址的编排方式不同,换句话说,存的位置都是一样的,只不过这个位置因为编址方式的不同使得它的地址编号不同,也因此产生了大小端问题。下面的理解均是我个人对于《计算机组成-结构化方法》第六版2.2.3节的理解,建议大家看原书。
首先,大端与小端这两个名词出自英国作家Jonathan Swift,他在《格列夫游记》一书中将这两个词用来讽刺那些因为争论打鸡蛋时应该打破大端还是小端而引发一场战争的政治家们。
每八位存储单元组成了一个字节,一定数量的字节组成字,这个一定数量由处理器决定,如果是32位处理器,那么一个字(32位字)就是4字节,64位处理器,一个字(64位字)是8字节。每个字中的字节地址可以从左到右或从右到左编排。如图a,是从左到右排列(大端),图b是从右到左排列(小端)。

不管是大端还是小端,用来表示一个32位整数时,比如说6,都是在最右边的(最低位)3位上存放6的二进制值110,前面的29位都是0,换句话说,在大端派的计算机中,有110这三位的应该是字节3(或者是7、11、15),而在小端派计算机中是字节0(或者是4、8、12)中。
如果计算机只用来存放整数,那么不会有任何问题。然而,许多应用中要存放的是整数、字符串和其他数据类型的混合结构。例如,我们要在计算机中存放一个由一个字符串(名字)和两个整数(年龄和编号)组成的简单的员工记录。如图a、b分别给出了用大端派和小端派计算机表示同一个员工Jim Smith(年龄21、编号260)的不同存储方式。

两种表示方式都没有问题,但是当一台计算机要从网络上向另一台计算机发送这个数据时,就有问题了。嘉定从大端派计算机向小端派发送上面的数据,每次一个字节,从字节0一直到字节19。即大端派的字节0送到小端派的字节0,一次下去。如图c

对比图b会发现数据出错了,名称没有问题,但是年龄和编号变了,换句话说传输过程中按照字节对应传输,对于字符串没有问题,但是对于年龄和编号等整数就不对了。如果只是简单的将传递过来的数据反转,将会出现图d的情况。

对比图b发现,年龄和编号对了,但是名称会变成"MIJTIMS",最后的"H"会因为前面的0而无法输出。这个问题没有简单的解决办法。可行但不太全面的一条途径是在每个数据项前面加上一个头来描述其后的数据类型和数据长度,使接收方可对数据进行必要的转换。

转载于:https://www.cnblogs.com/zijintime/p/7656157.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值