运算方法和运算器 _ 定点运算

移位运算

移位:通过改变各个数码位和小数点的相对位置,从而改变各数码位的位权。
目的: 移位运算很常见,比如进制转化:15 m = 1500 cm,在计算机中,移位与加减法配合能够实现乘除法运算

在计算机中,移位运算分为两种:

  1. 逻辑移位:无符号数的移位运算
  2. 算数移位:有符号数的移位运算

对于移位运算,需要注意两个问题:
1.移位运算的现实意义和机器意义不一样:

  • 现实意义: 小数点右移2位(小数点动)
  • 机器用语 15相对于小数点 左移2位(小数点不动,数字移动

因此对于机器:\(左移=绝对值扩大,右移=绝对值缩小\)

2.移位运算必然带来数据的丢失和缺失。

  • 丢失的位可能会影响精度,甚至会导致算数出错,(不可避免)
  • 对于缺失的位需要进行填充合适的数据,以达到运算正确。

下面针对不同的编码方式进行分类讨论:

逻辑移位

无符号数的移位称为 逻辑移位。
对于逻辑移位数据的丢失和缺失都很显然:

  • 如果左移丢失1,算数将出错;如果右移丢失1,将影响精度。
  • 无论是左移还是右移,都应在空缺位置填0。

算数移位

有符号数的移位称为 算术移位。
显然移位运算不可能改变符号,因此对于所有的编码方式 符号位均不参与移位

原码

对与原码,只看数值位,规则应和 逻辑位移 相同:

  • 如果左移丢失1,算数将出错;如果右移丢失1,将影响精度。
  • 符号位不参与移位,左移、右移都补0。

image

反码和补码

反码和原码的差别就是:在负数时,反码是原码的取反,因此反码的规则应是:

  • 符号位不参与移位;
  • 正数时:左移、右移都补0;
  • 负数时:左移、右移都补1。

补码正数和原码相同,负数是反码+1(补码最低位与原码一致,其余位与反码一致),因此补码的规则应是:

  • 符号位不参与移位;
  • 正数时:左移、右移都补0;
  • 负数时:左移补0、右移都补1

规则小结

  1. 无论什么编码方式,符号位均不变
  2. 填补代码规则如下:
    image

例子: 设机器数字长为8位(含1位符号位),写出A=+26时,三种机器数左、右移一位和两位的表示形式及对应的真值,并分析结果的正确性。
解:
A=+26=+11010
原码补码反码相同=0,0011010
image

定点加减法

补码加减法

引入补码的原因就是为了方便加法运算,因此加减法运算只学习补码的加减法。

补码的主要作用:两个 有符号数可以直接连同符号位一起相加,就可以得到正确的答案(符号位产生的进位自然丢掉)。
也就是:对于任何数,\([x]_补 + [y]_补 = [x+y]_补\)

点击查看证明

假设采用定点整数表示,
因此证明的先决条件是:
\(|x|≤2^n-1;|y|≤2^n-1;|x+y|≤2^n-1\)

分四种情况来证明
(1)x﹥0,y﹥0,则x+y﹥0
\([x]_补=x, [y]_补=y, [x+y]_补=x+y\)
所以等式成立.

(2)x﹥0,y﹤0,则x+y>0或x+y<0
\([x]_补=x, [y]_补=2^{n+1}+y\),
\([x]_补+[y]_补=x+ 2^{n+1}+y =2^{n+1}+ x+ y= [x+y]_补\)

(3)x<0,y>0,则x+y>0或 x+y<0
这种情况和第2种情况一样,把x和y的位置对调即得证。

(4)x<0,y<0,则x+y<0
(相加两数都是负数,则其和也一定是负数。)
\([x]_补=2^{n+1}+x,   [y]_补=2^{n+1}+y\)
\([x]_补+[y]_补\)
\(=2^{n+1}+x+2^{n+1}+y\)
\(=2^{n+1}+(2^{n+1}+x+y)\)
\(= [x+y]_补\)

对于减法: A-B=A+(-B) 可以转化为加法来做。
即:\([A-B]_补=[A+(-B)]_补=[A]_补+[-B]_补\)
\([-B]_补 : [B]_补\)连同符号位一起取反加1

点击查看证明

image

根据上述的公式来计算一道题:

A =15, B =-24, C = 124,求[A+C]补和[B−C]补
\(A = +1111 \to 0,1111 \to 0,0001111\)(补码)
\(B = -11000 \to 1,01000 \to 1,1101000\)(补码)
\([C]_补=0,1111100\)\([-C]_补=1,0000100\)
[A+C]补 = 0,0001111 + 0,1111100 = 1,0001011 真值-117
[B−C]补 = 1,1101000 + 1,0000100 =10,1101100 真值+108

显然都不对,这就是溢出
对上面例子简单分析下,会发现溢出的情况就是:

  • 两个正数,符号位为0;但是数值位却发生了进位,使符号位变成1.
  • 两个负数,符号位为1;但是数值位却未发生进位,使符号位还是0.

溢出检测

溢出
在定点整数机器中,数的表示范围 \(|x|≤2^n-1\)。在运算过程中,如出现大于字长绝对值的现象,称为“溢出”。

有两种溢出的情况:

  • 两正数加,变负数,上溢(大于机器所能表示的最大数)
  • 两负数加,变正数,下溢(小于机器所能表示的最小数)

溢出会导致算数出错,因此必须要判断是否溢出。常见的溢出检测方法有两种:

在定点机中,当运算结果发生溢出时表示出错,机器通过逻辑电路自动检查出这种溢出,并进行中断处理。

单符号位法

单符号位法就是对上述分析的两种情况的符号化。

公式\(V=C_f ⊕ C_0\)

  • \(C_f\)为符号位产生的进位
  • \(C_0\)为最高有效位产生的进位

也就是:
\(C_f\) \(C_0\)
0  0  正确
0  1  正溢
1  0  负溢
1  1  正确

双符号位法(常用)

规则:

  1. 符号位占两位,00表示正数,11表示负数。
  2. 两符号位都参加运算
  3. 最高符号位上产生的进位要丢掉。

例如:\([A+B]_补\) = 00,0001111 + 11,1101000 = 11,1110111

判断溢出逻辑表达式:\(S_{f1}\)为最高符号位。;\(S_{f2}\)为第二符号位,则\(V=S_{f1} ⊕ S_{f2}\)
若V=0,表示无溢出;若V=1,表示有溢出。

全部情况如下:
\(S_{f1}\) \(S_{f2}\)
0  0   正确(正数)
0  1   正溢
1  0   负溢
1  1   正确(负数)

主要注意两点:

  • 不论溢出与否,\(S_{f1}\) 始终表示正确的符号, 低位符号位参与移位
  • 实际存储时存储单符号位,运算时转化成双符号位。

原码 定点乘法

对于一个乘法,笔算过程如下:
image

显然,如果计算使用该方法需要使用4个小的寄存器存放临时结果,还需要一个大的寄存器存放最终结果。很浪费资源,且需要寄存器数量不固定,因此需要优化。

笔算乘法的改进: 我们可以将笔算过程抽象成如下固定步骤。
image

运算步骤

(一)、符号部分 符号单独处理,判断符号方法略。
(二)、数值部分

  • 部分积开始为0

  • 每次看乘数最后一位是1还是0
    如果乘数该位是1:
    部分积先右移,然后将溢出的数据放到乘数前面,最后加上被乘数
    乘数右移
    如果乘数该位是0:
    部分积先右移,然后将溢出的数据放到乘数前面,最后加上0
    乘数右移

  • 运算完所有位数后,再右移一次(溢出位需要放到乘数前)

  • 答案就是: 部分积(拼接)乘数

机器过程

上面过程在计算机中,实际过程就是:(ACC存放部分积;MQ存放当前乘数,用于获取乘数最低位)
(一)、符号部分 符号单独处理,判断符号方法略。
(二)、数值部分

  • ACC开始为0

  • 每次看MQ最后一位是1还是0
    若该位是1:
    ACC+=被乘数,将结果放入ACC,将ACC右移(部分积右移),将MQ右移且将ACC移走的低位放入MQ最高位(将乘数右移,使最低位移动)。
    若该位是0:
    ACC+=0,将结果放入ACC,将ACC右移(部分积右移),将MQ右移且将ACC移走的低位放入MQ最高位(将乘数右移,使最低位移动)。

  • 运算完所有位数后,再右移一次(溢出位需要放到乘数前)

  • 答案就是: ACC拼接MQ的数

例:
image

定点除法(不考)

笔算除法

商符单独处理
心算上商
余数不动低位补“0”
减右移一位的余数
上商位置不固定

image

机器除法

符号位异或形成

|x|-|y|>0 上商1
|x|-|y|<0 上商0

余数左移一位 低位补“0”减除数

1倍字长加法器

image

恢复余数法

说明
先看被除数和除数谁大

  • 如果被除数大:

  • 如果除数大:

  • 每次减去除数

  • 如果结果为正数,则直接左移,上商1

  • 如果结果为负数,则加上除数恢复原数,再左移,上商0

image

例子
image
image

不恢复余数法

不恢复余数法运算规则:加减交替法
被除数或余数 减 除数(比较大小):

  • 结果为正,商上1,左移一位,减除数,

  • 结果为负,商上0,左移一位,加除数.

重复上述操作n+1次。

特点

  • 上商n+1次
  • 第一次上商判溢出
  • 移n次,加n+1次
  • 用移位的次数判断除法是否结束

例子:
image

结果:
符号位: \(x_0 \bigoplus y_0 =1 \bigoplus 1 = 0\)
数值部分:按绝对值相除
\(\frac{x^*}{y^*}=0.1101\),则\([\frac{x}{y}]_原 =0.1101\)

逻辑运算

逻辑非运算(求反 \(\overline{x}\)

(求反,按位求反,常用变量上方加一横来表示)
按位取反,原来是“0”的位变为“1”;原来是“1”的位变为“0”

非门
image

[例24] x1=01001011 , x2=11110000 , 求 \(\overline{x1} , \overline{x2}\)
x1 = 10110100
x2 = 00001111

逻辑或运算(逻辑加“+”)

只要相“或”的两位有一位是1,结果就是1;否则结果为0
一般用来“
或门
image

[例25] x=10100001 , y=10011011 , 求 x+y
解:
  1 0 1 0 0 0 0 1  x
+ 1 0 0 1 1 0 1 1  y
————————————
  1 0 1 1 1 0 1 1  z
即 x+y = 10111011

逻辑与运算(逻辑乘 “.”)

只有相“与”的两位都是1,结果才是1;
否则“与”的结果为0

一般用来:把某些位清零。
与门
image

[例26] x=10111001 , y=11110011 , 求 x.y
解:
  1 0 1 1 1 0 0 1  x
  1 1 1 1 0 0 1 1  y
————————————
  1 0 1 1 0 0 0 1  z
即 x·y = 10110001

逻辑异或运算 (“ ⊕ ”)

只有相“异或”的两位不相同,结果才是1;否则结果为0
作用
欲取反的位与“1”异或,
欲保留的位与“0”异或。

异或门
image

[例27] x=10101011 , y=11001100 , 求 x ⊕ y
解:
  1 0 1 0 1 0 1 1  x
⊕ 1 1 0 0 1 1 0 0  y
————————————
  0 1 1 0 0 1 1 1  z
即 x⊕y = 01100111

posted @ 2022-09-20 14:21  kingwzun  阅读(346)  评论(0编辑  收藏  举报