1.4 二进制算数运算
1.4.1 二进制算术运算的特点
二进制数的加、减、乘、除四则运算,在数字系统中是经常遇到的,它们的运算规则与十进制数很相似。加法运算是最基本的一种运算。在计算机中,引入补码表示后,加上一些控制逻辑,利用加法就可以实现二进制的减法、乘法和除法运算。
1.二进制的加法运算
二进制加法运算法则:0+0=0;0+1=1+0=1;1+1=10(逢2进1)。
【例1-1】求(1011011)2+(1010.11)2
则
(1011011)2+(1010.11)2=(1100101.11)2
2.二进制数的减法运算
二进制减法运算法则为:0-0=1-1=0;0-1=1(借1当2);1-0=1。
【例1-2】求(1010110)2-(1101.11)2
则
(1010110)2-(1101.11)2=(1001000.01)2
3.二进制数的乘法运算
二进制乘法运算法则为:0×0=0;0×1=1×0=0;1×1=1。
【例1-3】求(1011.01)2×(101)2
则
(1011.01)2×(101)2=(111000.01)2
可见,二进制乘法运算可归结为“移位与加法”。
4.二进制数的除法运算
二进制除法运算法则为:0÷0=0;0÷1=0;1÷1=1。
【例1-4】求(100100.01)2÷(101)2=?
则
(100100.01)2÷(101)2=(111.01)2
可见,二进制除法运算可归结为“减法与移位”。
1.4.2 原码、反码、补码和补码运算
1.原码
正数的符号位为0,负数的符号位为1,其他位按照一般的方法数的绝对值来表示就构成了原码。
【例1-5】求当机器字长为8位二进制数的原码。
X=+1011011 Y=-1011011
解:
[X]原码=01011011 [Y]原码=11011011
2.反码
对于有效数字(不包括符号位)为n位的二进制数N的反码(N)INV是这样定义的
具体来说,对于一个带符号的数来说,正数的反码与其原码相同,负数的反码为其原码除符号位以外的各位按位取反。
【例1-6】求机器字长为8位二进制数的反码。
X=+1011011 Y=-1011011
解:
[X]原码=01011011 [X]反码=01011011
[Y]原码=11011011 [Y]反码=10100100
负数的反码与负数的原码有很大的区别,反码通常用作求补码过程中的中间形式。
3.补码
引入补码以后,计算机中的加减运算都可以统一化为补码的加法运算,其符号位也参与运算。为了说明补码运算的原理,我们先来讨论一个生活中常见的事例。例如,你在 6 点钟的时候发观自己的手表停在9点上了,因而必须把表针拨回到6点。由图1-3可以看出,这时有两种拨法:第一种拨法是往回拨3格,9-3=6,拨回到了6点;另一种拨法是往前拨9格,9+9 =18。由于表盘的最大数只有12,超过 12以后的“进位”将自动消失,于是就只剩下减去 12 以后的余数了,即18-12=6,也将表针拨回到了6点。这个例子说明,9-3 的减法运算可以用9+9的加法运算代替。因为3和9相加正好等于产生进位的模数12,所以我们称9为-3对模12的补数,也称为补码(Complement)。
图1-3 说明补码运算原理的例子
从这个例子中可以得出一个结论,就是在舍弃进位的条件下,减去某个数可以用加上它的补码来代替。这个结论同样适用于二进制数的运算。一个 4 位二进制数的模为 16。例如:0111(7)是-1001(9)对模16的补码。
基于上述原理,对于有效数字(不包括符号位)为n位的二进制数N,它的补码(N)COMP表示方法为
由式1-7可知,正数(当符号位为0时)的补码与原码相同,负数(当符号位为1时)的补码等于(N)INV+1=2n−N,即负数的补码为其反码加1。
【例1-7】写出二进制数的补码:(1)X=+1011011(2)Y=-1011011。
解:(1)根据定义有:[X]原码=01011011 [X]补码=01011011
(2)根据定义有:[Y]原码=11011011 [Y]反码=10100100
[Y]补码=10100101
补码表示的整数范围是−2n−1~2n−1−1,其中n为机器字长 8。位二进制补码表示的整数范围是-128~+127(-128 表示为10000000,无对应的原码和反码)。16 位二进制补码表示的整数范围是-32768~+32767。当运算结果超出这个范围时,就不能正确表示数了,此时称为溢出。
4.补码加、减运算规则
(1)运算规则
[X+Y]补=[X]补+[Y]补
[X-Y]补=[X]补+[-Y]补
(2)溢出判断,一般用双符号位进行判断
符号位00表示正数;11表示负数;结果的符号位为01时,称为上溢;为10时,称为下溢。
【例1-8】设x=+1101,y=-0111,符号位为双符号位用补码求x+y,x-y。
解:
[x]补+[y]补=00 1101+11 1001=00 0110
[x-y]补=[x]补+[-y]补=00 1101+00 0111=01 0100。
上溢出,结果错误。