2.2.1 使用二进制数表示正整数
我们先使用前面类似十进制数表示正整数的思路来得到使用二进制数表示正整数的方法。比如对于一个字长为8位的二进制序列10101110,用下面的等式表示为
1×27+0×26+1×25+0×24+1×23+1×22+1×21+0×20=174
该二进制序列的含义可用表2.4表示。
表2.4 二进制序列10101100的含义
与使用十进制表示正整数不同的是,二进制权值的基底为2,而不是10。但是,与使用十进制数字序列表示正整数类似,使用二进制表示正整数就是二进制数字与对应的权值加权与求和。所以只要给定一个二进制序列,就可以得到该二进制序列所对应的正整数值。
在该例子中,二进制序列使用了8位字长,那么8位的二进制序列字长可以表示的正整数(包含零)的范围是多少呢?如表2.5所示。显然,对于8位字长的二进制序列,可以表示的正整数(包括零)的范围为0~255。
表2.5 8位字长的二进制序列所对应的正整数(包括零)的范围
进一步地,对于n位字长的二进制序列来说,其表示的正整数(包括0)的范围为0~(2n-1)。例如,对于16位字长的二进制序列来说,其表示的正整数(包括0)的范围为0~65535。
在前面的例子中,使用二进制序列得到了所对应的正整数。那么现在的问题是,如果给定了一个十进制正整数,那么又该如何将其转换成所对应的二进制序列呢?
传统上使用长除法,但这种方法使用起来比较复杂,运算量大。在本书中使用比较法将正整数转换为所对应的二进制序列。与传统的长除法相比,使用比较法将显著减少运算量,并且读者很容易掌握这种方法。对于一个正整数231来说,其转换为8位字长的二进制序列的过程如表2.6所示。
表2.6 将8位字长的正整数231转换为对应的二进制序列
可将表3.6中的转换过程描述如下。
(1)将正整数231与最大权值27(=128)进行比较,因为231>128,因此得到新的余数为231-128=103,所对应的二进制数为1。
(2)将得到的余数103与第二个权值26(=64)进行比较,因为103>64,因此得到新的余数为103-64=39,所对应的二进制数为1。
(3)将得到的余数39与第三个权值25(=32)进行比较,因为39>32,因此得到新的余数为39-32=7,所对应的二进制数为1。
(4)将得到的余数7与第四个权值24(=16)进行比较,因为7<16,因此保留上次得到的余数7,所对应的二进制数为0。
(5)将得到的余数7与第五个权值23(=8)进行比较,因为7<8,因此继续保留前面得到的余数7,所对应的二进制数为0。
(6)将得到的余数7与第六个权值22(=4)进行比较,因为7>4,因此得到新的余数为7-4=3,所对应的二进制数为1。
(7)将得到的余数3与第七个权值21(=2)进行比较,因为3>2,因此得到新的余数为3-2=1,所对应的二进制数为1。
(8)将得到的余数1与第八个权值20(=1)进行比较,因为1=1,因此得到新的余数为1-1=0,所对应的二进制数为1。
将所对应的二进制数从左到右进行排列,就得到二进制序列“11100111”。
前面介绍的是二进制数与正整数(包括0)对应的转换方法,实际上整数不但包含正整数,也应该包含零和负整数。下面将详细介绍使用二进制数表示负整数的方法。
思考与练习2-4:当使用32位二进制数来表示十进制正整数(包括0)时,可以表示的数的范围是____________________。因此,使用的二进制位数越多,可表示的正整数的范围就越________(大/小)。
思考与练习2-5:对于十进制正整数214,通过比较法将其转换为对应的二进制数(该二进制数的位宽为8位),并且给出详细的转换过程。
思考与练习2-6:对于十进制正整数62341,通过比较法将其转换为对应的二进制数(该二进制数的位宽为16位),并且给出详细的转换过程。