寻址和字节顺序

排列表示一个对象的字节有两个通用的规则。考虑一个w位的整数,位表示为[XW-l'
Xw-2' …, xl'  xo], 其中Xw-l 是最高有效位,而Xo是最低有效位。假设w是8的倍数,这些位
就能被分组成为字节,其中最高有效字节包含位[Xw-l' xw-2' …, Xw-8] ,而最低有效字节包含位
[X7'  X6' …, xo]-' 其他字节包含中间的位。某些机器选择在存储器中按照从最低有效字节到最高
有效字节的顺序存储对象,而另一些机器则按照从最高有效字节到最低有效字节的顺序存储。前
一种规则一一最低有效字节在最前面的方式,称为小端法(little endiàn)。大多数Intel兼容机都
采用这种规则。后一种规则一一最高有效字节在最前面的方式,称为大端法(bigendian)。大多
数IBM和SunMicrosystems的机器都采用这种规则。注意我们说的是"大多数"。这些规则并没
有严格按照企业界限来划分。比如,IBM和Sun制造的个人计算机使用的是Intel兼容的处理器,
因此用的就是小端法。许多比较新的微处理器使用双将法(bi-endian),也就是说可以把它们配

置成作为大端或者小端的机器运行。

。不过有时候,字节顺序会成为问题。首先是在不同类型的机
器之间通过网络传送二进制数据时,一个常见的问题是当小端法机器产生的数据被发送到大端法机
器或者反方向发送时会发现,接收程序字里的字节成了反序的。为了避免这类问题,网络应用程序
的代码编写必须遵守已建立的关于字节顺序的规则,以确保发送方机器将它的内部表示转换成网络
标准,而接收方机器则将网络标准转换为它的内部表示

第二种情况是,当阅读表示整数数据的字节序列时字节顺序也很重要。通常在检查机器级程
序时会出现这种情况。举一个示例,从某个文件中摘出了下面这行代码,该文件给出了一个针对
Intel IA32处理器的机器级代码的文本表示:
80483bd:  01  05  64  94  04  08  add 毛eax, Ox8049464
这一行是由反汇编器(disassembler) 生成的,反汇编器是一种确定可执行程序文件所表示的指
令序列的工具。我们将在第3章学习有关这些工具的更多知识,以及怎样解释像这样的行。现
在,我们只需注意这行表述了十六进制字节串01 05  64  94  04  08是一条指令的字节级表
示,这条指令把一个字长的数据加到存储在主存地址Ox8049464的值上。如果取出这个序列的


后4个宇节:64  94  04  08,按照相反的顺序写出,我们得到08 04  94  64。去掉开头的0
得到值Ox8049464. 这就是右边的数值。当阅读此类小端法机器生成的机器级程序表示时,经
常会将字节按照相反的顺序显示。书写字节序列的自然方式是最低位字节在左边,而最高位字节
在右边,这正好和通常书写数字时最高有效位在左边,最低有效位在右边的方式相反。
字节顺序变得可见的第三种情况是当编写规避正常的类型系统的程序时。在C语言中,可
以使用强制类型转换(c剧〉来允许以一种数据类型引用一个对象,而这种数据类型与创建这个
对象时定义的数据类型不同。大多数应用编程都强烈不推荐这种编码技巧,但是它们对系统级编
程来说是非常有用,甚至是必需的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值