- 计算机系统:从应用程序到底层实现
- 赵欢 杨科华编著
- 1673字
- 2025-05-07 10:52:33
2.1.3 进制转换
在计算机内部,所有信息都采用二进制编码。但在计算机外部,为了书写和阅读的方便,大都采用八进制、十进制、十六进制表示形式,同时还有许多其他的进制,例如三进制(例如军队中一个排有三个班、一个连有三个排等)、六十进制(例如一分钟有60秒、一小时有60分钟)等,因此,必须实现这些进制之间的相互转换。
1.R进制数转换成十进制数
任何一个R进制数转换成十进制数时,如前所述,只需要“按权展开”即可。例如,十六进制数转换为十进制数:
(F8C. B)16=F×162+8×16+C×160+B×16-1
=15×162+8×16+12×160+10×16-1
=3980.6875
二进制数转换为十进制数:
(110.01)2=1×22+1×2+0×20+0×2-1+1×2-2
=6.25
2.十进制数转换成R进制数
在将十进制数转换成R进制数时,需要分别考虑整数和小数部分。
(1)整数部分
对于整数部分,采用的是除基取余法,即用目标数制的基数R去除十进制数,第一次相除所得余数为目的数的最低位,将所得商再除以基数R,反复执行上述过程,直到商为0,所得余数为目的数的最高位。
例:将十进制整数135分别转换成八进制数和七进制数。转换成八进制数的过程如下:

转换成七进制数的过程如下:

所以有:(135)10=(207)8=(252)7。
(2)小数部分
对于小数部分,采用“乘基取整”的方式,即将小数部分与基数R相乘,乘积的整数部分即为小数点后面第一个数位的值,乘积的小数部分继续与基数R相乘。以此类推,直到某一步乘积的小数部分为0或者数位已经到了指定的值。
例:将十进制小数0.6875转换成二进制小数。转换过程如下:

所以有(0.6875)10=(0.1011)2。
例:将十进制小数0.73转换成三进制小数,小数点后面保留4位值。转换过程如下:

所以有(0.73)10≈(0.2021)3。
对于一个在表示范围内的整数而言,其在各个进制之间可以相互精确转换,因为在表示范围内的整数不管是哪种进制,都有唯一的表示。当范围扩展到实数域的时候,由于每个整数之间有无穷多个有理数,而每种进制下特定位数能精确表示的小数范围不一样,因此就会造成如上的精度损失问题。
3.二进制、八进制、十六进制数的相互转换
(1)八进制数转换成二进制数
八进制数转换成二进制数的方法很简单,只需要把每一个八进制数字改写成等值的3位二进制数即可,且保持高低位的次序不变。
八进制数字与二进制数字的对应关系如下:
(0)8=(000)2 (1)8=(001)2 (2)8=(010)2 (3)8=(011)2
(4)8=(100)2 (5)8=(101)2( 6)8=(110)2 (7)8=(111)2
例:将(1435.132)8转换成二进制数。
直接替换即可,有(1435.132)8=(001100011101.001011010)2。
(2)十六进制数转换成二进制数
十六进制数转换成二进制数的方法,与八进制数转换成二进制数的方法类似,即将每一个十六进制数字改写成等值的4位二进制数,且保持高低位的次序不变。
十六进制数字与二进制数字的对应关系如下:
(0)16=(0000)2 (1)16=(0001)2 (2)16=(0010)2 (3)16=(0011)2
(4)16=(0100)2 (5)16=(0101)2 (6)16=(0110)2 (7)16=(0111)2
(8)16=(1000)2 (9)16=(1001)2 (A)16=(1010)2 (B)16=(1011)2
(C)16=(1100)2 (D)16=(1101)2 (E)16=(1110)2 (F)16=(1111)2
例:将(3A. B)16转换成二进制数。
直接替换即可,有(3A. B)16=(00111010.1011)2。
(3)二进制数转换成八进制数
二进制数转换成八进制数时,整数部分从低位向高位方向每3位用一个等值的八进制数替换,最后不足3位时在高位补0凑满3位;小数部分从高位向低位方向每3位用一个等值八进制数来替换,最后不足3位时在低位补0凑满3位。
例如:
(0.10101)2=(000.101010)2=(0.52)8
(10011.01)2=(010011.010)2=(23.2)8
(4)二进制数转换成十六进制数
二进制数转换成十六进制数时,整数部分从低位向高位方向每4位用一个等值的十六进制数替换,最后不足4位时在高位补0凑满4位;小数部分从高位向低位方向每4位用一个等值十六进制数来替换,最后不足4位时在低位补0凑满4位。
例如:
(11001.11)2=(00011001.1100)2=(19.C)16
从上面的描述可以看出,二进制数与八进制数、二进制数与十六进制数之间有很简单、直观的对应。八进制数与十六进制数虽然不能用计算机直接表示,但可以转换成二进制数,并且像十进制数一样简练,因此在平时开发和调试程序、查看机器代码时,都采用十六进制或八进制来显示,这样便于书写和阅读。