1.4 计算机数的运算基础

1.4.1 进位计数制及相互转换

1.进位计数制

按进位的原则进行计数的方法称为进位计数制,简称进位制。人们在日常生活中习惯使用十进制,但二进制易于实现、存储、传输,所以计算机中采用二进制。而二进制不易于书写和阅读,因此又引入了八进制和十六进制。

1)十进制(后缀或下标D表示)

十进制计数原则:逢十进一

十进制的基数:10

十进制的数码:0 1 2 3 4 5 6 7 8 9

十进制数第K位的权:10K

第K位的权为基数的K次方,第K位的数码与第K位权的乘积表示第K位数的值。

例如:8846.78D=8×103+8×102+4×101+6×100+7×10-1+8×10-2

该数中共出现三次数码8,但各自的权不一样,故其代表的值也不一样。

2)二进制(后缀或下标B表示)

二进制计数原则:逢二进一

二进制的基数:2

二进制的数码:0 1

二进制数第K位的权:2K

例如:11010101.01B=1×27+1×26+0×25+1×24+0×23+1×22+0×21+1×20+0×2-1+1×2-2=213.25D。

N位二进制数可以表示2N个数。例如,3位二进制数可以表示8个数,如表1.3所示。

表1.3 二进制数与十进制数对照表

3)八进制(后缀或下标O表示)

八进制计数原则:逢八进一

八进制的基数:8

八进制的数码:0 1 2 3 4 5 6 7

八进制数第K位的权:8K

例如:127O=1×82+2×81+7×80=87D。

4)十六进制(后缀或下标H表示)

十六进制计数原则:逢十六进一

十六进制的基数:16

十六进制的数码:0 1 2 3 4 5 6 7 8 9 A B C D E F

十六进制数第K位的权:16K

例如:64.4H=6×161+4×160+4×16-1=100.25D。

十六进制数、二进制数和十进制数的对应关系如表1.4所示。

表1.4 常用进制数对照表

2.不同进制数之间的转换

1)二进制数转换为十进制数

转换原则:按权展开求和。

例如:10001101.11B=1×27+0×26+0×25+0×24+1×23+1×22+0×21+1×20+1×2-1+1×2-2=141.75D。

八进制数和十六进制数转换为十进制数也同样遵循该原则,不再单独介绍。

2)十进制数转换为二进制数

十进制数转换为二进制数的原则:① 整数部分除基取余,逆序排列;

               ② 小数部分乘基取整,顺序排列。

例如:将十进制数186和0.8125转换成二进制数。

所以:186D=10111010B,0.8125D=0.1101B。

注意:当十进制小数不能用有限位二进制小数精确表示时,根据精度要求,采用“0舍1入”法,取有限位二进制小数近似表示。

十进制数转换为八进制数和十六进制数同样遵循该原则。

3)二进制数转换为十六进制数

由于十六进制的基数是2的幂,所以二进制数与十六进制数之间的转换是十分方便的。二进制数转换为十六进制数的原则:整数部分从低位到高位4位一组(不足补零),直接用十六进制数来表示;小数部分从高位到低位4位一组(不足补零),直接用十六进制数表示。

例如:将二进制数10011110.00111转换成十六进制数。

所以:10011110.00111B=9E.38H。

4)十六进制数转换为二进制数

十六进制数转换为二进制数的原则:十六进制数中的每一位用4位二进制数来表示。

例如:将十六进制数A87.B8转换为二进制数。

所以:A87.B8H=101010000111.10111000B。

八进制的基数同样是2的幂,因此二进制数与十六进制数之间的转换也遵循以上的原则,只是将原则中的4位改成3位。

例如:将二进制数11010110.110101转换成八进制数。

将八进制数746.42转换成二进制数。

所以:11010110.110101B=326.65O,746.42O=111100110.100010B。

3.八进制数和十六进制数运算

1)二进制数的运算

加法法则 乘法法则

0+0=0 0×0=0

0+1=1 0×1=0

1+0=1 1×0=0

1+1=0(进位1) 1×1=1

注意:二进制数加法运算中1+1=0(进位1)和逻辑运算中1∨1=1的含义不同。

2)十六进制数的运算

十六进制数的运算遵循“逢十六进一”的原则。

(1)十六进制数加法。

十六进制数相加,当某一位上的数码之和S<16时与十进制数进行同样处理。如果数码之和S≥16时,则应该用S减16及进位1来取代S。

例如:

(2)十六进制数减法。

十六进制数减法也与十进制数类似,够减时直接相减,不够减时服从向高位借1为16的原则。

例如:

十六进制数的乘除运算同样根据“逢十六进一”的原则处理,这里不再详述。

1.4.2 计算机中数和字符的表示

1.计算机中有符号数的表示

计算机中的数是用二进制来表示的,有符号数中的符号也是用二进制数值来表示。0表示“+”号,1表示“-”号,这种符号数值化之后表示的数称为机器数,它表示的数值称为机器数的真值。

为将减法变为加法,以方便运算简化CPU的硬件结构,机器数有三种表示方法:原码、反码和补码。

1)原码

最高位为符号位,符号位后表示该数的绝对值。例如:

[+112]=01110000B;

[-112]=11110000B。

其中最高位为符号位,后面的7位是数值(字长为8位;若字长为16位,则后面15位为数值)。

用原码表示时,+112和-112的数值位相同,符号位不同。

说明:

(1)0的原码有两种表示法。

[+0]=00000000B;

[-0]=10000000B。

(2)N位原码的表示范围为1-2N-1~2N-1-1。

例如:8位原码表示的范围为-127~+127。

2)反码

最高位为符号位,正数的反码与原码相同;负数的反码为其正数原码按位求反。例如:

[+112]=01110000B;

[-112]=10001111B。

说明:

(1)0的反码有两种表示法。

[+0]=00000000B;

[-0]=11111111B。

(2)N位反码表示的范围为1-2N-1~2N-1-1。

例如:8位反码表示的范围为-127~+127。

(3)符号位为1时,其后不是该数的绝对值。

例如:反码11100101B的真值为-27,而不是–101。

3)补码

最高位为符号位,正数的补码与原码相同;负数的补码为其正数原码按位求反再加1。例如:

[+112]=01110000B;

[-112]=10010000B。

说明:

(1)0的补码只有一种表示法:[+0]=[-0]=00000000B。

(2)N位补码所能表示的范围为-2N-1~2N-1-1。

例如:8位补码表示的范围为-128~+127。

(3)8位机器数中:[-128]=10000000B,[-128]和[-128]不存在。

(4)符号位为1时,其后不是该数的绝对值。

例如:补码11110010B的真值为-14,而不是-114。

有符号数采用补码表示时,就可以将减法运算转换为加法运算。因此计算机中有符号数均以补码表示。

例如:X=84-16=(+84)+(-16)→[X]=[+84]+[-16]

[+84]=01010100B。

[-16]=11110000B。

所以:[X]=01000100B,即X=68。

在字长为8位的机器中,第7位的进位自动丢失,但这不会影响运算结果。机器中这一位并不是真正丢失,而是保存在程序状态字PSW中的进位标志Cy中。

又如:X=48-88=(+48)+(-88)→[X]=[+48]+[-88]

[+48]=00110000B。

[-88]=10101000B。

所以:[X]=11011000B,即X=-40。

为进一步说明补码如何将减法运算转换为加法运算,我们举一个日常的例子:对于钟表,它所能表示的最大数为12点,我们把它称之为模,即一个系统的量程或所能表示的最大的数。若当前标准时间为6点,现有一只表为9点,可以有两种调时方法。

① 9-3=6(倒拨)。

② 9+9=6(顺拨)。

即有9+9=9+3+6=12+6=9-3。

因此对某一确定的模,某数减去小于模的一数,总可以用加上该数的负数与其模之和(即补码)来代替。故引入补码后,减法就可以转换为加法。

补码表示的数还具有以下特性。

[X+Y]=[X]+[Y]

[X-Y]=[X]+[-Y]

如表1.5所示为N=8和N=16时N位补码数的表示范围。

表1.5 N位二进制补码数的表示范围

2.无符号整数

在某些情况下,处理的全是正数时,就不必再保留符号位。我们把最高有效位也作为数值处理,这样的数称之为无符号整数。8位无符号数表示的范围为0~255。

计算机中最常用的无符号整数是表示存储单元地址的数。

3.字符表示

字母、数字、符号等各种字符(例如,键盘输出的信息或打印输出的信息都是按字符方式输出)按特定的规则,用二进制编码在计算机中表示。字符的编码方式很多,最普遍采用的是美国标准信息交换码ASCII码。

ASCII码是7位二进制编码。计算机中用一个字节表示一个ASCII码字符,最高位默认为0,可用做校验位,如表1.6所示。

表1.6 美国标准信息交换码(ASCII)字符表

相关机器码间关系如表1.7所示。

表1.7 相关机器码关系表