计算机系统:基于x86+Linux平台
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.1.2 进位计数制

人们在日常生活中通常使用十进制数,其每个数位可用10个不同的符号0,1,2,…,9表示,每个符号处在十进制数中的不同位置时,所代表的数值也不一样。例如,2585.62代表的值如下:

(2585.62)10=2×103+5×102+8×101+5×100+6×10-1+2×10-2

一般地,任意一个十进制数

D=dndn-1d1d0. d-1d-2d-mmn为正整数)

其值可表示为如下形式:

VD)=dn×10n +dn-1×10n -1+…+d1×101+d0×100+d-1×10-1+d-2×10-2+…+d-m×10-m

其中dii=nn-1,…,1,0,-1,-2,…,-m)可以是0、1、2、3、4、5、6、7、8、9这10个数字符号中的任一个,10被称为基数(base),它代表每个数位上可使用的不同数字符号的个数。10i称为第i位上的权。在进行十进制数的运算时,每位计满10之后就要向高位进一,即“逢十进一”。

类似地,二进制数的基数是2,只使用两个不同的数字符号0和1,运算时采用“逢二进一”的规则,第i位上的权是2i。例如,二进制数(100101.01)2代表的值如下:

(100101.01)2=1×25+0×24+0×23+1×22+0×21+1×20+0×2-1+1×2-2=(37.25)10

一般地,任意一个二进制数

B=bnbn-1b1b0. b-1b-2b-mmn为正整数)

其值可表示为如下形式:

VB)=bn×2n +bn-1×2n -1+…+b1×21+b0×20+b-1×2-1+b-2×2-2+...+b-m×2-m

其中bii=nn-1,…,1,0,-1,-2,…,-m)只可以是0和1两种不同的数字符号。

扩展到一般情况,在R进制数字系统中,应采用R个基本符号(0,1,2,…,R-1)表示各位上的数字,采用“逢R进一”的运算规则,对于每一个数位i,该位上的权为RiR被称为该数字系统的基。

在计算机系统中常用的进位计数制有下列几种。

• 二进制。R=2,基本符号为0和1。

• 八进制。R=8,基本符号为0、1、2、3、4、5、6、7。

• 十六进制。R=16,基本符号为0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。

• 十进制。R=10,基本符号为0、1、2、3、4、5、6、7、8、9。

表2.1列出了二进制、八进制、十进制、十六进制4种进位计数制中各基本数之间的对应关系。

表2.1 4种进位计数制中各基本数之间的对应关系

如表2.1所示,十六进制的前10个数字与十进制的前10个数字相同,后6个基本符号A、B、C、D、E、F的值分别为十进制的10、11、12、13、14、15。在书写时可使用下标方式或后缀字母标识该数的进位计数制,一般用B(Binary)表示二进制,用O(Octal)表示八进制,用D(Decimal)表示十进制(后缀可省略),H(Hexadecimal)则是十六进制数的后缀,有时也用0x表示十六进制数的前缀,如二进制数10011B、十进制数56D或56、十六进制数308FH或0x308F。

计算机内部所有信息都采用二进制编码表示。但是,为方便书写和阅读,在计算机外部大都采用十进制或十六进制表示形式。因此,计算机在数据输入后或输出前都必须实现这些进位制数和二进制数之间的转换。

1. R进制数转换成十进制数

任何一个R进制数转换成十进制数时,只要“按权展开”即可。

例2.1 将二进制数(10101.01)2转换成十进制数。

解:(10101.01)2=(1×24+0×23+1×22+0×21+1×20+0×2-1+1×2-210=(21.25)10

例2.2 将八进制数(307.6)8转换成十进制数。

解:(307.6)8=(3×82+7×80+6×8-110=(199.75)10

例2.3 将十六进制数(3A.C)16转换成十进制数。

解:(3A.C)16=(3×161+10×160+12×16-110=(58.75)10

2.十进制数转换成R进制数

任何一个十进制数转换成R进制数时,要分别转换整数和小数部分。

(1)整数部分的转换

整数部分的转换方法是“除基取余,上右下左”。用要转换的十进制整数除以基数R,将得到的余数作为结果数据中各数位上的数字,直到上商为0为止。上面的余数(先得到的余数)作为右边低位上的数字,下面的余数作为左边高位上的数字。

例2.4 将十进制整数135分别转换成八进制数和二进制数。

解:将135分别除以8和2,将每次的余数按从低位到高位的顺序排列如下:

所以,(135)10=(207)8=(1000 0111)2

(2)小数部分的转换

小数部分的转换方法是“乘基取整,上左下右”。用要转换的十进制小数乘以基数R,将得到的乘积的整数部分作为结果数据中各数位上的数字,小数部分继续与基数R相乘,以此类推,直到某一步乘积的小数部分为0或已得到希望的位数为止。最后,将上面的整数部分作为左边高位上的数字,下面的整数部分作为右边低位上的数字。

例2.5 将十进制小数0.6875分别转换成二进制数和八进制数。

解:

因此,(0.6875)10=(0.1011)2

因此,(0.6875)10=(0.54)8

在转换过程中,乘积的小数部分可能总得不到0,即转换得到希望的位数后还有余数,这种情况下得到的是近似值。

例2.6 将十进制小数0.63转换成二进制数。

解:

因此,(0.63)10=(0.1010…)2

(3)含整数、小数部分的数的转换

只要分别转换整数部分和小数部分,再组合两者即可得到一个完整的数。

例2.7 将十进制数135.6875分别转换成二进制数和八进制数。

解:只要将例2.4和例2.5的结果合起来即可,即(135.6875)10=(10000111.1011)2=(207.54)8

3.二进制数和十六进制数的相互转换

(1)十六进制数转换成二进制数

只要按照表2.1所示的十六进制数与二进制数的对应关系,把每个十六进制数改写成等值的4位二进制数即可,且保持高低位次序不变。

例2.8 将十六进制数(2B.5E)16转换成二进制数

解:(2B.5E)16=(0010 1011.0101 1110)2=(101011.0101111)2

(2)二进制数转换成十六进制数

整数部分从低位向高位方向每4位用一个等值的十六进制数替换,最后不足4位时在高位补0凑满4位;小数部分从高位向低位方向每4位用一个等值的十六进制数替换,最后不足4位时在低位补0凑满4位。例如,(11001.11)2=(0001 1001.1100)2=(19.C)16

二进制数与十六进制数之间的对应关系简单直观。二进制数太长,书写、阅读均不方便;八进制数和十六进制数却像十进制数一样简练,易写易记。虽然计算机中使用二进制,但为了在开发和调试程序、查看机器代码时便于书写和阅读,人们经常使用八进制或十六进制等价表示二进制,因此必须熟练掌握八进制数和十六进制数的表示及其与二进制数之间的转换。