[REV] 运算和运算器

博客主要介绍了定点加减法及其溢出检测,包括无符号溢出、有符号溢出等情况,还阐述了运算器设计,如串行进位、先行进位加(减)法器,原码一位乘、补码乘法器等,最后讲解了浮点数运算,包含规格化、对阶、尾数加减等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定点加减法

  • [ X + Y ] 补 = [ X ] 补 + [ Y ] 补 [X+Y]_补=[X]_补+[Y]_补 [X+Y]=[X]+[Y]
  • [ X − Y ] 补 = [ X ] 补 − [ − Y ] 补 [X-Y]_补=[X]_补-[-Y]_补 [XY]=[X][Y]
  • -Y补码的生成:从右至左扫描,0跳过,遇见1,从下一位开始取反.

定点加减法的溢出检测

原理:如果两正数相加结果是负数或两负数相加结果是正数,则发生溢出.

无符号溢出

  • 加法溢出应用最高进位.
  • 减法溢出用进位取反.

有符号溢出

  • 略.
  • OVERFLOW=C0+C1.即最高数据进位和符号位进位.

其他

  • 变形补码:采用双符号位的补码.在运算时,如果出现10或01的符号位就是溢出.10是下溢.01是上溢.
  • 逻辑左:最高位进CF,低位补0;右: 高位补0 低位截断
  • 算术左:同逻辑左;右:符号位不变并COPY右移,低位移除(=/2)

运算器设计

串行进位加(减)法器

  • 略.
  • 减法的设定:Y在输入前和算符指示位P异或,同时P作为最低位的进位输入.

先行进位加(减法)器

C i + 1 = A i B i + ( A i + B i ) C i C_{i+1}=A_iB_i+(A_i+B_i)C_i Ci+1=AiBi+(Ai+Bi)Ci

G i = A i B i + A i B i G i − 1 P = ∑ ( A i + B i ) G_i=A_i B_i+A_iB_iG_{i-1}\\ P=\sum (A_i+B_i) Gi=AiBi+AiBiGi1P=(Ai+Bi)

原码一位乘

  • *0=+00000 *1=+X
while(! Reach_to_the_top)
{
	Result_Temp+=Calculate(X,Y_lowest);
	Rightmove(Result_Temp);
	Rightmove(Y);
}

补码乘法器

[ X ⋅ Y ] 补 = [ X ] 补 × ∑ ( Y i + 1 − Y i ) ⋅ 2 − i [X\cdot Y]_补=[X]_补\times \sum (Y_{i+1}-Y_i)\cdot 2^{-i} [XY]=[X]×(Yi+1Yi)2i
符号位参与运算.
Y 0 = 0 Y_0=0 Y0=0开始.

  • i f Y i + 1 Y i = 10 if Y_{i+1}Y_i=10 ifYi+1Yi=10,部分积+ [ X ] 补 [X]_补 [X],部分积和称数均右移.
  • i f Y i + 1 Y i = 01 if Y_{i+1}Y_i=01 ifYi+1Yi=01,部分积+ [ − X ] 补 [-X]_补 [X],部分积和称数均右移.
  • i f Y i + 1 Y i = 11 / 00 if Y_{i+1}Y_i=11/00 ifYi+1Yi=11/00,部分积+0,部分积和称数均右移.
  • 最后一步不移位.
  • 部分积的移位移入乘数SEG.当乘数SEG没有乘数之后停止计算.

Ref:https://blog.youkuaiyun.com/liuchuo/article/details/52921504

比如x = -0.1101,y=0.1011

先写出x的补码:[x]补 = 11.0011,再写出-x的补码:[-x]补 = 00.1101

一开始部分积的初值是:00.0000

在y后面加个0~那么y变成了0.10110

然后从y的最后两位开始往前,0.10110当前最后两位是10,所以加上[-x]补:

00.0000 + 00.1101 = 00.1101

右移一位,变成00.01101

此时y =0.10110的最后两位变成了11(是往前挪了一个位置哦,不是两个~),按照规则应该直接右移一位就好啦,就变成了00.001101

此时y =0.10110的最后两位变成了01,所以根据规则要加[x]补:

00.001101 + 11.0011 = 11.011001

右移一位,变成了11.1011001

此时y =0.10110的最后两位变成了10,加上[-x]补:

11.1011001 + 00.1101 = 00.1000001

右移一位,变成了:00.01000001

此时y =0.10110最后两位是01(所以从这里就可以知道规则里面要在y前面补一个0的作用了吧嘿嘿),加[x]补:

00.01000001 + 11.0011 = 11.01110001

因为这已经是最后一步了,所以不用再右移了,所以最后结果就是1.01110001

这个结果是x*y的补码哦~

阵列乘法器

在这里插入图片描述

原码一位除:恢复余数法

试减:如果余数小于0则恢复并置商=0否则置1不恢复.

浮点数运算

规格化:00.1or11.0

  • 对阶
  • 尾数加减
  • 规格化
  • 舍入
  • 溢出处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值