- 微控制器的选择与应用
- 曹昕鸷等编著
- 2822字
- 2025-02-23 00:52:22
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 相关机器码关系表
