计算机的算术运算
符号数一律用补码表示,运算时符号位和数字位一起参加运算。运算结果也用补码表示。
有符号数:
当正数减负数并得到负数结果,负数减正数得到正数,减法运算发生溢出。
当不同符号的操作数相加,不会发生溢出。
面对溢出,可以在运算前扩展最高位。 运算结束后,恢复位宽。
无符号加减法不存在溢出问题
乘法
乘法器 移位 相加
带符号的乘法
带符号乘法,把被乘数和乘数转换为正数,记住起始的符号。符号位不参与运算。
在移位时对带符号的积进行符号扩展,当算法结束,进行保留位宽。
快速乘法
快速乘法可以通过为每一个乘数位提供一个64位加法器。 一个输入是被乘数和一个乘数位相与的结果,另一个输入是上一个加法器的输出。
高64位加法器栈。 或者将这64位加法器组织成并行树。
RISCV中的乘法
乘mul
乘法取高位mulh
无符号乘法取高位mulhu
一个有符号一个无符号mulhsu
除法 长除法
每次迭代将除数右移一位,使之与除数对齐。
预处理,在步骤1减去除数,如果结果为正数,则除数小于等于被除数,所以在商中生成一位1。如果结果为负,在商中生成一位0.
被除数右移后扩展位数和除数位数相同。
有符号除法
商:如果符号相异,则商为负。
余数:被除数与余数符号相同,
RISCV除法
乘法和除法,需要一个左右移位的128位寄存器 和 一个实现加法或减法的64位ALU。
除div,无符号除divu,余数rem,无符号余数remu
浮点运算
规格化后的科学计数法。
规格化:科学计数法中整数部分没有前导0的数字。
增加尾数位数大小可以提高小数精度,增加指数位数可以增加数表示的范围。
RISVV中浮点数表示,最高位为符号位,8位指数位,23位尾数。
浮点运算也会发生溢出中断,是因为指数太大而无法在指数字段中表示出来。
减少上溢和下溢一种方式是提供具有更大指数范围的格式。
例外和中断
有上溢和下溢应该让用户知道出现了什么问题。 引发中断来告知问题的出现。
IEEE745浮点数标准
浮点加法
1 对阶
2 尾数相加
3 规格化
在加法之后,对其进行移位,适当调整指数大小,把它变为规格化的形式。
4 舍入
对最后结果进行舍入,保留位宽。
5 溢出判断
若阶码溢出,进行溢出处理
浮点乘法
1 阶码相加
符号位异或,阶码相加
2尾数相乘
3 规格化
整数部分没有前导0.
4 舍入
5 溢出判断
浮点数的乘法运算的尾数不存在溢出,而只存在浮点数的阶码确定。
精确算术
浮点数通常只能进行近似值运算。
IEEE745中间运算时,保留两个额外的位,保护位和舍入位。
利用保护位进行舍入。