《汇编程序设计与计算机体系结构:软件工程师教程》 —1.4.3 怎样表示无符号的整数

华章计算机 发表于 2019/12/03 21:41:31 2019/12/03
【摘要】 本节书摘来自华章计算机《汇编程序设计与计算机体系结构:软件工程师教程》一书中第1章,第1.4.3节,作者是布莱恩·R. 霍尔(Brian R. Hall)[美] 凯文·J.斯隆卡(Kevin J. Slonka),爱飞翔 译。

1.4.3 怎样表示无符号的整数

有两个与数制有关的技巧是应该掌握的,一个是在各种进制的数之间转换,另一个是完成加法这样的基本运算。表1-5列出了 0 至 15 之间的数所对应的十进制、二进制及十六进制表示方式。

表1-5 无符号整数在三种数制之间的对应关系

image.png

 

下面举 9 个例子来演示怎样在各种进制的无符号数之间转换以及如何做加法。

1.二进制十进制:用量表来转换,表中列有从 20 至 2n 的 n + 1 个级别,其中 n = 二进制位数 - 1

2.二进制 → 十进制:用按位展开式来转换

3. 十进制 → 二进制:用除法来转换

4.计算保存十进制值所需的二进制位数

5. 二进制数的加法

6.十六进制二进制 十进制

7.十六进制 → 十进制:用按位展开式来转换

8.十进制 → 十六进制:用除法来转换

9.十六进制数的加法

      提示:十进制数可以通过下列三种方式转换成以其他数为底的进制:

basen 量表(参见范例1-3及范例1-8)。

按位展开式:十进制值 = (Dn-1 × Bn-1) + (Dn-2 × Bn-2) + … + (D1 × B1) + (D0 × B0),其中B是底,D是各数位的具体取值,n 表示B进制数共有多少位(参见范例1-4及范例1-9)。

除法(参见范例1-5及范例1-10)。

 

范例1-3在8位二进制数与十进制数之间转换。这个例子采用的具体数值是二进制的 00010111,也就是十进制的 23(000101112 = 2310)。把二进制数转换成十进数时,先找出值为 1 的二进制位,然后在表中查出对应的十进制值,最后将其相加,这样就得到了与原数相等的十进制数。

范例1-3 二进制 ? 十进制(2n 量表)

 image.png

范例 1-4 演示了怎样用按位展开式将二进制数转换成十进制数。这个例子采用的具体数值是二进制的 00010111,也就是十进制的 23。

范例1-4 二进制 → 十进制(按位展开式)

 image.png

范例1-5演示怎样用除法把十进制数转化成二进制数。本例采用的十进制数是 42,相当于二进制的 101010。首先,把十进制数 42与二进制的底(也就是 2)相除,商是 21,余数是 0。把余数 0写在除法的右侧,在最终的转换结果中,它就是最低有效位。接下来,反复做除法,也就是用前一次除法所得的商除以 2,并将余数记在相应除法的右侧,直到所得的商小于 2 为止。此时的商只可能是 0 或 1,该数在最终的转换结果中是最高有效位。现在,把最后除法所得的商写在转换结果的最左边,然后将历次除法所得的余数从下往上依次写在商的后面。

范例 1-6 演示了怎样计算保存某个十进制值所需的二进制位数。比方说,要保存 42 这个十进制值,就需要用 6 个二进制位。

范例1-5 十进制 → 二进制(除法)

 image.png

范例1-6 计算保存十进制值所需的二进制位数

 image.png

      学习指南:你可能想用二进制位数= ceiling(log2n)来计算保存十进制值所需的二进制位数,这对于大多数情况(例如范例 1-6 中的情况)来说是成立的,但如果要计算的十进制值恰好是 2 的幂,比方说 32,那么就会得出错误的结果。ceiling(log232) 的结果是 5,而实际上必须用 6 个二进制位才能将它表示出来,因为 3210 = 1000002。

 

范例1-7演示了二进制数的加法。规则很简单:

 image.png

范例 1-7 二进制数的加法

 image.png

范例1-8演示了怎样在十六进制、二进制与十进制之间转换。十六进制数转二进制数所依据的规律是:前者中的每个数位是由后者中的四个数位组成的。十六进制数转十进制数,可以根据以 16 为底的 16n 量表来做(这就像范例 1-3 所演示的那样:把二进制数转换成十进制数,可以根据以 2 为底的 2n 量表来做)。这个例子所用的具体数值是:00011010101101112 =

683910 = 1AB716。

范例 1-8 十六进制?二进制?十进制

 image.png

范例1-9演示了怎样用按位展开式把十六进制数转换成十进制数。这个例子所用的具体数值是1AB716 = 683910。

范例 1-9 十六进制 → 十进制(按位展开式)

 image.png

范例 1-10 演示了怎样用除法把十进制数转换成十六进制数。这个例子所用的具体数值是 803910 = 01F6716。计算过程与范例 1-5 类似,只不过每次都是除以 16,而不是除以 2。

范例 1-10 十进制 → 十六进制

 image.png

范例 1-11 演示了怎样根据公式来对十六进制数做加法。即如果 xi + yi ≥ b,那么 zi = (zi MOD b),并向高位进1。这个公式也适用于其他进制(b 表示数制的底)。

这个例子所用的具体数值是4B216 + 6A416 = B5616,算式最左侧那一列所写的 xi,yi与zi,用来指代这三个数值的各个数位。

范例 1-11 十六进制数的加法

image.png

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。