1.2 进位计数制及其转换
计算机能够处理数值、文字、声音、图像等信息。读者也许会问:为什么作为电子设备的计算机能处理那么多复杂的信息呢?实际上,当把这些信息转换成计算机能识别的形式就能进行处理。目前计算机中所有的信息都用“0”和“1”两个数字符号组合的二进制数来表示。
数值、图形、文字等各种形式的信息,需要计算机加工处理时,首先必须按一定的法则转换成二进制数。本节将首先以常用的十进制为出发点,来讨论二进制、八进制及十六进制的特点,然后介绍各种进制数之间的转换方法。
1.2.1 十进制数的表示
进位计数制是一种计数的方法,习惯上最常用的是十进制计数法。十进制数的每位数可以用下列10个数码之一来表示:0、1、2、3、4、5、6、7、8、9。十进制数的基数为10,基数表示进位制所具有的数码的个数。
十进制数的计数规则是“逢十进一”,也就是说,每位累计不能超过9,计满10就应向高位进1。
一般来讲,任意一个十进制数N,可以用位置计数法表示如下:
(N )10 = (an–1an–2…a1a0.a–1a–2…a–m)10
也可以用按权展开式表示如下:
(N )10 = an–1 × 10n–1 + an–2 × 10n–2 + … + a1 × 101 + a0 × 100
+ a–1 × 10–1 + a–2 × 10–2 + … + a–m × 10–m
=
式中,ai表示各个数字符号为0~9这10个数码中的任意一个;n为整数部分的位数,m为小数部分的位数;10i为该位数字的权。例如:
(1234.56)10 = 1 × 103 + 2 × 102 + 3 × 101 + 4 × 100 + 5 × 10–1 + 6 × 10–2
通常,对十进制数的表示,可以在数字的右下角标注10或D。
1.2.2 二进制数、八进制数和十六进制数的表示
计算机中为了便于存储及计算的物理实现,采用了二进制。二进制数的基数为2,只有0、1两个数码,其计数规则是“逢二进一”,即每位计满2就向高位进1。它的各位的权是以2i表示的。
对于任意一个二进制数N,用位置计数法表示为:
(N )2 = (an–1an–2…a1a0.a–1a–2…a–m)2
用按权展开式表示为:
?(N )2 = an–1 × 2n–1 + an–2 × 2n–2 + … + a1 × 21 + a0 × 20
??+ a–1 × 2–1 + a–2 × 2–2 + … + a–m × 2–m
=
式中,ai表示各个数字符号为0或1这两个数码中的任意一个;n为整数部分的位数,m为小数部分的位数;2i为该位数字的权。例如:
(101101)2 = 1 × 25 + 0 × 24 + 1 × 23 + 1 × 22 + 0 × 21 + 1 × 20 = (45)10
通常,对二进制数的表示,可以在数字的右下角标注2或B。
二进制数运算规则简单,便于电路实现,它是数字系统中广泛采用的一种数制。但因二进制表示一个数时,所用的位数比用十进制数表示的位数多,人们读写很不方便,容易出错。因此常采用八进制或十六进制。C语言程序设计中就经常会用到这两种进制。
八进制数的基数是8,采用的数码是0、1、2、3、4、5、6、7。计数规则是“逢八进一”,它的各位的权是以8i表示的。通常,对八进制数的表示,可以在数字的右下角标注8或O,但在C语言中是在数的前面加数字0来表示。例如,(1234)8就是表示一个八进制数,而不是十进制数1234,在C语言中它表示为01234。
十六进制数的基数是16,采用的数码是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。其中A、B、C、D、E、F分别表示十进制数字10、11、12、13、14、15。十六进制的计数规则是“逢十六进一”,它的各位的权是以16i表示的。通常,对十六进制数的表示,可以在数字的右下角标注16或H,但在C语言中是在数的前面加数字0和字母X即0X来表示。例如,(12AF)16就是表示一个十六进制数,在C语言中它表示为0X12AF。
由此可得出:十进制、八进制、二进制与十六进制的特征对照表如表1-1所示。
表1-1 二进制、八进制、十进制与十六进制的特征对照表
进 制 | 数 码 | 计 数 规 则 | 数的表示法 |
十进制 | 0、1、2、3、4、5、6、7、8、9 | 逢十进一 | (1234)10 |
二进制 | 0、1 | 逢二进一 | (1101)2 |
八进制 | 0、1、2、3、4、5、6、7 | 逢八进一 | (4567)8 |
十六进制 | 0~9、A、B、C、D、E、F | 逢十六进一 | (45AF)16 |
1.2.3 二进制数和十进制数的转换
1.二进制转换为十进制数
二进制数转换成十进制数是很方便的,只要将二进制数写成按权展开式,并将式中各乘积项的积计算出来,然后各项相加,即可得到与该二进制数相对应的十进制数。例如:
(11010.101)2 = 1 × 24 + 1 × 23 + 0 × 22 + 1 × 21 + 0 × 20
??+ 1 × 2–1 + 0 × 2–2 + 1 × 2–3
= 16 + 8 + 2 + 0.5 + 0.125
=(26.625)10
2.十进制转换为二进制数
十进制数转换成二进制数分成整数部分转换和小数部分转换,下面分别来介绍它们转换的方法。
(1)整数部分转换
把要转换的十进制数的整数部分不断除以基数2,并记下余数,直到商为0为止。
【例1-1】 (N )10 = (117)10
117 / 2 = 58 (a0 = 1) 最低整数位
58 / 2 = 29 (a1 = 0)
29 / 2 = 14 (a2 = 1)
14 / 2 = 7 (a3 = 0)
7 / 2 = 3 (a4 = 1)
3 / 2 = 1 (a5 = 1)
1 / 2 = 0 (a6 = 1) 最高整数位
所以 (N )10 = (1110101)2。
注意:对于整数部分的转换第一次除以2所得到的余数是二进制数整数的最低位,最后所得到的余数是二进制数整数的最高位。
(2)小数部分转换
对于被转换的十进制数的小数部分则应不断乘以基数2,并记下其整数部分,直到结果的小数部分为0为止。
【例1-2】 (N )10 = (0.8125)10
0.8125 × 2 = 1.625 (b1 = 1) 最高小数位
0.625 × 2 = 1.25 (b2 = 1)
0.25 × 2 = 0.5 (b3 = 0)
0.5 × 2 = 1.0 (b4 = 1) 最低小数位
所以 (N )10 = (0.1101)2。
注意:对于小数部分的转换式中的整数不参加连乘,第一次乘以2所得到的整数部分是二进制数小数的最高位,最后所得到的整数部分是二进制数小数的最低位。
在十进制的小数部分转换中,有时连续乘以2不一定能使小数部分等于0,这说明该十进制小数不能用有限位二进制小数表示。这时,只要取足够多的位数,使其误差达到所要求的精度就可以了。
十进制数转换成二进制数的这种方法其实也适用于十进制数转换成其他进制的数,只是基数不再是2,而是要转换的进制数的基数。下面的例子是将一个十进制数转换成八进制数。
【例1-3】 (N )10 = (117)10
117 / 8 = 14 (a0 = 5) 最低整数位
14 / 8 = 1 (a1 = 6)
1 / 8 = 0 (a2 = 1) 最高整数位
所以 (N )10 = (165)8。
【例1-4】 (N )10 = (0.8125)10
0.8125 × 8 = 6.5 (b1 = 6) 最高小数位
0.5 × 8 = 4.0 (b2 = 4) 最低小数位
所以 (N )10 = (0.64)8。
1.2.4 二进制数、八进制数和十六进制数的转换
八进制数的基数是8(8 = 23),十六进制数的基数是16(16 = 24)。二进制数、八进制数和十六进制数之间具有2的整指数倍的关系,因而可直接进行转换。
1.二进制数 → 八进制数
从小数点开始,分别向左、右按3位分组转换成对应的八进制数字字符,最后不满3位的,则需补0。
【例1-5】 将二进制数(1101101.10101)2转换成八进制数。
具体方法为:
二进制数: | 0 0 1 | 1 0 1 | 1 0 1 | . | 1 0 1 | 0 1 0 |
| ↓ | ↓ | ↓ |
| ↓ | ↓ |
八进制数: | 1 | 5 | 5 | . | 5 | 2 |
所以 (1101101.10101)2 = (155.52)8。
2.八进制数 → 二进制数
将每位八进制数用3位二进制数表示即可。
【例1-6】 将八进制数(345.64)8转换成二进制数。
具体方法为:
八进制数: | 3 | 4 | 5 | . | 6 | 4 |
| ↓ | ↓ | ↓ |
| ↓ | ↓ |
二进制数: | 011 | 110 | 101 | . | 110 | 100 |
所以 (345.64)8 = (11100101.1101)2。
3.二进制数 → 十六进制数
从小数点开始,分别向左、右按4位分组转换成对应的十六进制数字字符,最后不满4位的,则需补0。
【例1-7】 将二进制数(1101101.10101)2转换成十六进制数。
具体方法为:
二进制数: | 0 1 1 0 | 1 1 0 1 | . | 1 0 1 0 | 1 0 0 0 |
| ↓ | ↓ |
| ↓ | ↓ |
十六进制数: | 6 | D | . | A | 8 |
所以 (1101101.10101)2 = (6D.A8)16。
4.十六进制数 → 二进制数
将每位十六进制数用4位二进制表示即可。
【例1-8】 将十六进制数(A8D.6C)16转换成二进制数。
具体方法为:
十六进制数: | A | 8 | D | . | 6 | C |
| ↓ | ↓ | ↓ |
| ↓ | ↓ |
二进制数: | 1010 | 1000 | 1101 | . | 0110 | 1100 |