• 内容讲解

1. 定点加减法运算

定点加、减法运算属于算术运算,要考虑参加运算数据的符号和编码格式。在计算机中,定点数据主要有原码、反码、补码三种形式;在定点加减法运算时,三种编码形式从理论上来说都是可以实现的,但难度不同。

首先,原码是一种最直接、方便的编码方案,但是它的符号位不能直接参加加减运算,必须单独处理。在原码加减运算时,一方面要根据参加运算的两个数据的符号位,以及指令的操作码来综合决定到底是做加法还是减法运算,另一方面运算结果的符号位也要根据运算结果来单独决定,实现起来很麻烦。

其次,反码的符号位可以和数值位一起参加运算,而不用单独处理。但是反码的运算存在一个问题,就是符号位一旦有进位,结果就会发生偏差,因此要采用循环进位法进行修正,即符号位的进位要加到最低位上去,这也会带来运算的不便。

两个数进行补码运算时,可以把符号位与数值位一起处理。只要最终的运算结果不超出机器数允许的表示范围,运算结果一定是正确的。这样一来,补码运算就显得很简单,因为它既不需要事先判断参加运算数据的符号位,运算结果的符号位如果有进位,也只要将进位数据舍弃即可,不需做任何特殊处理。

因此,现代计算机的运算器一般都采用补码形式进行加减法运算。

1)补码加法

补码加法的公式是:

[x]+[y]=[x+y]          (mod 2)                   (式2-11)

在模2意义下,任意两数的补码之和等于该两数之和的补码,这是补码加法的理论基础。之所以说是模2运算,是因为最高位(即符号位x0和y0)相加结果中的向上进位是要舍去的。

由此可见,当两数以补码形式相加时,符号位可以作为数据的一部分参加运算而不用单独处理;运算的结果将直接得到两数之和的补码;符号位有进位也只要丢弃即可。这样的运算规则十分方便,这也是补码在计算机内大量使用的原因。

2)补码减法

由于减去一个数就是加上这个数的负数,

∴                                [x-y]=[x+(-y)]=[x]+[-y]   (mod 2)             (式2-12)

从[y]求[-y]的法则:当已知[y]要求[-y]时,只要将[y]连同符号位“取反且最低位加1”即可。

由此可见,补码定点减法和补码定点加法在本质上是相同的,因此,减法运算可以转换成加法运算,使用同一个加法器电路,无需再配减法器,从而可以简化计算机的设计。

3)溢出及其判断

在计算机中,由于机器码的位数是有限的,所以数的表示范围也是有限的。如果两数进行加减运算之后的运算结果超出了给定的取值范围,这就称为溢出。在定点数运算中,正常情况下溢出是不允许的。

两个正数相加,结果大于机器所能表示的最大正数,称为正溢。而两个负数相加,结果小于机器所能表示的最小负数,称为负溢。

溢出的判定方法一般有单符号位法和双符号位法两种,我们以下只讨论双符号位法。

双符号位法用两个符号位表示一个数据,由于有两个符号位,所以相加时是模4的相加运算。

用双符号位法进行溢出判断的方法是:如果两个数相加后,其结果的两个符号位一致(00或11),则没有发生溢出;如果两个符号位不一致(10或01),则发生溢出,具体来说,两个符号位为01时为正溢,10时为负溢;不论溢出与否,运算结果的最高符号位始终指示正确的符号。

这样,在双符号位方式下,只要将两个符号位进行异或运算,异或结果为0的就表示正常,异或结果为1的就表示溢出。由此,机器就可以通过逻辑电路自动检查出这种溢出,并进行相应的中断处理。

2. 定点乘除法运算

基本运算器的功能只能完成数码的传送、加法和移位,并不能直接完成两数的乘除法运算,但在实际运算中,乘除法却又是计算机的基本运算之一,下面我们讨论实现乘除法运算的方法。

从实现角度来说,实现乘除法运算一般有三种方式:

① 采用软件实现乘除法运算。利用基本运算指令,编写实现乘除法的循环子程序。这种方法所需的硬件最简单,但速度最慢。

② 在原有的基本运算电路的基础上,通过增加左右移位和计数器等逻辑电路来实现乘除法运算,同时增加专门的乘除法指令。这种方式的速度比第一种方式快。

③ 自从大规模集成电路问世以来,高速的单元阵列乘除法器应运而生,出现了各种形式的流水式阵列乘除法器,它们属于并行乘除法器,也有专门的乘除法指令。这种方法依靠硬件资源的重复设置来赢得乘除运算的高速,是三种方式中速度最快的一种。

从编码角度考虑,由于乘除法结果的符号位确定比较容易,运算结果的绝对值和参加运算的数据的符号无关,所以用原码实现也很简单,但在现代计算机中一般还是采用补码进行乘除法运算。

3. 逻辑运算

在计算机中,运算器除了要进行加、减、乘、除等算术运算外,还要完成各种逻辑运算。参加逻辑运算的数据称为逻辑数,是不带符号位的二进制数,或者不用考虑是否有符号位以及数据格式,只是把它当成一种简单的数字“0”和“1”的组合。通常用“1”表示逻辑真,用“0”表示逻辑假。

利用逻辑运算可以进行两个数的比较,或者从某个数中选取某几位等操作。由于在文本、图片、声音等非数值数据中有着广泛的应用,因此逻辑运算也是一种非常重要的运算。

计算机中的逻辑运算主要包括逻辑非、逻辑与、逻辑或、逻辑异或等4种运算。

1)逻辑非运算(NOT)

逻辑非运算又称为取反运算,就是对某个操作数的各位按位取反,使每一位0变成1,1变成0。逻辑非运算的运算符一般写成“ˉ”。

设x=x0x1x2…xn,则逻辑非标记为:

219.gif

2)逻辑与运算(AND)

逻辑与运算也叫逻辑乘,表示两个操作数相同位的数据进行按位“与”运算,两个都是1则结果为1,两个中只要有1个为0结果就是0。逻辑与运算的运算符一般写成“∧”或“·”。

逻辑与的特点是:对任何数据逻辑与0都会变成0,而逻辑与1则保持原有数据不变。所以在实际应用中,如果需要对一个数据的某几位清0(其他位保持不变)时,常常会用到逻辑与运算。

3)逻辑或运算(OR)

逻辑或运算也叫逻辑加,表示两个操作数相同位的数据进行按位“或”运算,两个都是0则结果为0,两个中只要有1个为1结果就是1。逻辑或运算的运算符一般写成“∨”或“+”。

逻辑或的特点是:对任何数据逻辑或1都会变成1,而逻辑或0则保持原有数据不变。所以在实际应用中,如果需要对一个数据的某几位置1(其他位保持不变)时,常常会用到逻辑或运算。

4)逻辑异或运算(XOR)

逻辑异或运算又称按位加,表示两个操作数相同位的数据进行按位“模2加”运算,若两个都相同则结果为0,若两个不同则结果为1。逻辑异或运算的运算符一般写成“⊕”。

逻辑异或的特点是:对任何数据逻辑异或1都会取反,而逻辑异或0则保持原有数据不变。所以在实际应用中,如果需要对一个数据的某几位取反(其他位保持不变)时,常常会用到逻辑异或运算。

逻辑异或还有一个特点,就是对一个数连续进行两次逻辑异或,该数就会恢复到原来的状态,这一特点在一些需要数据可恢复的操作中是很有用的。