64位汇编语言的编程艺术
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 十六进制数制系统

不好的是,二进制数非常冗长。例如,20210需要8个二进制位来表示,但只需要3个十进制位就可以表示。当处理较大的数时,使用二进制表示很快就会变得非常不适用。然而,计算机是采用二进制进行“思考”的,所以大多数时候使用二进制编码系统会非常方便。虽然我们可以在十进制表示和二进制表示之间进行转换,但这种转换并不是一项简单的任务。

十六进制(基数为16)数制系统解决了二进制系统中固有的许多问题:十六进制数非常紧凑,且向二进制数的转换非常简单,反之亦然。因此,大多数计算机系统工程师使用十六进制数制系统。

十六进制数的基数是16,用十六进制小数点左边的每个位乘以16的递增整数次幂就得到了对应的十进制数。例如,123416等于:

(1×163)+(2×162)+(3×161)+(4×160

或者

4096+512+48+4=466010

每个十六进制位分别对应0~1510之间16个数字中的某一个。因为只有10个十进制位,所以我们需要增加六个额外的数字来表示1010~1510对应的十六进制位。我们没有为这些数字创建新符号,而是分别使用字母A~F来表示。有效的十六进制数示例如下所示:

123416 DEAD16 BEEF16 0AFB16 F00116 D8B416

由于我们经常需要向计算机系统中输入十六进制数,而在大多数计算机系统中,我们不能使用下标来表示相关值的基数,因此需要采用一种不同的机制来表示十六进制数。我们将采用以下MASM约定。

(1)所有十六进制数均以数字字符开头,后缀为h。例如,123A4h和0DEADh。

(2)所有二进制数以b为后缀。例如,10010b。

(3)十进制数没有任何后缀字符。

(4)如果从上下文中可以很清楚地判别出基数,本书可能会省略后缀字符h或者b。

以下是一些使用MASM表示法的有效十六进制数示例:

1234h 0DEADh 0BEEFh 0AFBh 0F001h 0D8B4h

正如所见,十六进制数非常紧凑,并且可读性较好。此外,我们还可以轻松地在十六进制数和二进制数之间进行转换。表2-1提供了将十六进制数转换为二进制数所需的信息,反之亦然。

2-1 二进制与十六进制之间的转换

为了将十六进制数转换为二进制数,只需要将数中的每个十六进制数字替换为相应的4位二进制数字。例如,对于0ABCDh,可以根据表2-1对其中每个十六进制数字进行转换,如下所示:

将二进制数转换为十六进制数的方法也非常简单,以下为转换步骤。

(1)使用前导0填充二进制数,以确保该二进制数的位数是4的倍数。例如,给定二进制数1011001010,在该数字的左侧添加2位0,使其包含12位,即001011001010。

(2)将二进制数分成若干组,每组包含4位,例如,0010_1100_1010。

(3)在表2-1中查找这些组,并替换成对应的十六进制数字,因此得到2CAh。

这与十进制数和二进制数之间的转换(或者十进制数和十六进制数之间的转换)复杂度形成了鲜明的对比!

因为十六进制数和二进制数之间的转换是一个需要反复执行的操作,所以建议读者花点时间牢记其转换表(表2-1)。即使可以使用计算器进行转换,我们也会发现,在进行二进制数与十六进制数之间的转换时,手工转换会更快速,也更便捷。