计算机组成和设计 - 算术运算

411 阅读3分钟

计算机的算术运算

符号数一律用补码表示,运算时符号位和数字位一起参加运算。运算结果也用补码表示。

有符号数:

当正数减负数并得到负数结果,负数减正数得到正数,减法运算发生溢出。

当不同符号的操作数相加,不会发生溢出。

面对溢出,可以在运算前扩展最高位。 运算结束后,恢复位宽。

无符号加减法不存在溢出问题

乘法

乘法器 移位 相加

带符号的乘法

带符号乘法,把被乘数和乘数转换为正数,记住起始的符号。符号位不参与运算。

在移位时对带符号的积进行符号扩展,当算法结束,进行保留位宽。

快速乘法

快速乘法可以通过为每一个乘数位提供一个64位加法器。 一个输入是被乘数和一个乘数位相与的结果,另一个输入是上一个加法器的输出。

高64位加法器栈。 或者将这64位加法器组织成并行树。

RISCV中的乘法

乘mul

乘法取高位mulh

无符号乘法取高位mulhu

一个有符号一个无符号mulhsu

除法 长除法

每次迭代将除数右移一位,使之与除数对齐。

预处理,在步骤1减去除数,如果结果为正数,则除数小于等于被除数,所以在商中生成一位1。如果结果为负,在商中生成一位0.

被除数右移后扩展位数和除数位数相同。

有符号除法

商:如果符号相异,则商为负。

余数:被除数与余数符号相同,

RISCV除法

乘法和除法,需要一个左右移位的128位寄存器 和 一个实现加法或减法的64位ALU。

除div,无符号除divu,余数rem,无符号余数remu

浮点运算

规格化后的科学计数法。

规格化:科学计数法中整数部分没有前导0的数字。

增加尾数位数大小可以提高小数精度,增加指数位数可以增加数表示的范围。

RISVV中浮点数表示,最高位为符号位,8位指数位,23位尾数。

image.png

浮点运算也会发生溢出中断,是因为指数太大而无法在指数字段中表示出来。

减少上溢和下溢一种方式是提供具有更大指数范围的格式。

例外和中断

有上溢和下溢应该让用户知道出现了什么问题。 引发中断来告知问题的出现。

IEEE745浮点数标准

浮点加法

1 对阶

2 尾数相加

3 规格化

在加法之后,对其进行移位,适当调整指数大小,把它变为规格化的形式。

4 舍入

对最后结果进行舍入,保留位宽。

5 溢出判断

若阶码溢出,进行溢出处理

浮点乘法

1 阶码相加

符号位异或,阶码相加

2尾数相乘

3 规格化

整数部分没有前导0.

4 舍入

5 溢出判断

浮点数的乘法运算的尾数不存在溢出,而只存在浮点数的阶码确定。

精确算术

浮点数通常只能进行近似值运算。

IEEE745中间运算时,保留两个额外的位,保护位和舍入位。

利用保护位进行舍入。