计算机中 加减运算 的 实现原理

一,定点数 VS 浮点数
1,定点整数:x (x belong to 整数);
2,定点小数:0.x ;
3,浮点数:x.y (x != 0);

二,定点数的加/减法运算

定点小数/整数 相加,可以直接采用其原码形式 对其求和,即 x + y =》 [x] + [y] ,由于 正数的 “原,反,补码 相同“,所以 x+y => [x] + [y]
而 定点小数/整数 相减 时,首先需要将 定点整数/小数 转化为其 补码形式, **x - y =》 [x] + [-y]补**;

负数 x 求补方法 有如下几种:
1,x原码 符号位不变,数值位取反 求得[x] ,[x] 末尾加1,即为[x]
2,对[|x|] , 从右侧 到 左侧,第一个 1 及其 右边的 0 全部保留,经过第一个1以后,其左侧各位 均 取反;
3,通过 补码公式 进行求解;

1,补码 加减法 运算

1.1 补码加减法运算 规则

  • 补码 符号位要一起参与运算;
  • 对于 加减法 计算结果 中,超过 ”模“ 的部分 要将其舍弃;
    单符号位定点小数的模 为 2;单符号位定点整数的模 为 2n+1 ,n为 数值有效位;
    双符号位定点小数的模 为 22 ; 双符号位定点整数的模 为 2n+2 , n为 数值的有效位;

1.2 溢出 检测方法
加减法 运算结果 可能超出 机器字长,从而产生 溢出。对于 补码 加减法 运算,可以通过2种方式 检测 计算结果 是否发生溢出:
way1:采用双符号位 来 判断 运算结果 是否发生溢出(变形补码)
加减法运算中,真值 x , y的 补码 采用 双符号位 形式书写,且 其双符号位 均参与运算:
假设 Sf1 , Sf2 分别表示 双符号位的 高位 和 低位,运算结果中,不同Sf1 , Sf2 取值 将对应不同的 溢出结果:
Sf1 Sf2 result
0 0 没有溢出,结果为 正
0 1 结果溢出,结果应为 正
1 0 结果溢出,结果应为 负
1 1 没有溢出,结果为 负
conclusion1: 从上可知,在实际的电路设计中,我们可以通过 一个 “异或门” 来 判断 两个真值的运算结果 是否发生溢出:
if Sf1 XOR Sf2 == 1 , 则 运算结果发生溢出;
if Sf1 XOR Sf2 == 0 , 则 运算结果没有发生溢出;
conclusion2: 可以通过 最高符号位Sf1 来判断 运算结果的实际符号位,如果Sf1为 1,则实际符号位为 负,如果Sf1为 0,则实际符号位为正;
way2:采用单符号位 来 判断 运算结果 是否发生溢出
假设Cf,Co分别表示 符号位的进位,数值位的进位,则 可通过 判断 Cf,Co取值 来判断 运算结果 是否发生 溢出:
Cf Co result
0 0 没有溢出,结果为 正
0 1 上溢,结果 应为 正
1 0 下溢,结果 应为 负
1 1 没有溢出,结果为 负
**conclusion1:**在实际电路设计中,可以通过一个 ”异或门“ 来判断, 运算结果是否发生 溢出:
if Cf XOR Co == 1, 则 运算结果发生溢出;
if Cf XOR Co == 0, 则 运算结果没有发生溢出;
**conclusion2:**运算结果的实际符号位 以 Cf 为准,Cf == 1, 结果为 负;Cf == 0,结果为 正;

1.3 单位 二进制位 的 加法器
type1:半加器:计算结果 不考虑 进位
1 + 1 = 0;
1 + 0 = 1;
0 + 1 = 1;
0 + 0 = 0;
上述求和 公式 符合 ”异或“ 运算,因此,半加器 可以 通过 一个 ”异或门“ 来实现;
type2: 全加器:
一个全加器 包含 3个inputs, 2个outputs:
3个inputs 分别为:第i位的值 Ai , Bi,以及 上一位产生的进位 Ci-1;
2个outputs 分别为:第i位的计算结果 Si,以及 第i+1位 的 进位Ci+1;

猜你喜欢

转载自blog.csdn.net/u014765410/article/details/123597409
今日推荐