计算机的算术运算

饱和:饱和意味着当计算结果溢出时,结果被设置为最大的正数或者最小的负数。饱和操作一般更适合多媒体操作。



一、乘法 

1.原始乘法器

被乘数寄存器、 ALU 和积寄存器都是 64 位长,而乘数寄存器为 32位。   32 位的被乘数在开始时放 置在被乘数寄存器的右半部分, 然后每次左移 乘数则每次向相反的方向移动 算法开始时,积被初始化为 0。 控制逻辑决定何时对被乘数和乘数寄存器进行移位,以及何时将新值写入积寄存器。

计算机的算术运算_第1张图片

 计算机的算术运算_第2张图片

操作过程:

乘数右移一位x,交给控制测试,被乘数 * x(0/1),在ALU中与乘积部分相加,存放入乘积部分。被乘数左移一位。

乘数右移一位x',交给控制测试,被乘数 *x',与乘积部分相加,存放入乘积部分。被乘数左移一位。

得到的64位结果就在成绩里。

这里被乘数和ALU都是64位的,需要64位寄存器。

对乘法器进行改进,使得只需要32位寄存器即可。

2.改进后的乘法器计算机的算术运算_第3张图片

改进后的乘法器(实际上为65位),被乘数部分不变。乘积部分原始存放左32位为0,右32位为乘数。

操作过程:

开始乘积部分右移一位,得到乘数的最低位,最低位是1,控制测试传送指令,算术逻辑单元就将被乘数*1 与乘积部分的前32位相加,得到一个数据,存入乘积的前32位。

乘积部分再右移一位,若得到的最低位是0,则控制测试传送指令,将被乘数*1 与乘积部分的前32位相加,得到一个数据。

依次类推。

        实际上每次乘积部分右移,与被乘数相加的部分相当于被乘数扩大了2^n倍,最终得到的64位结果,就是所求的值。

二、除法

1.原始的除法器

在开始时, 32 位的商寄存器设为 0。 算法每次的迭代将除数向右移一位。 所以我们需要在开始时将除数放置在 64 位除数寄存器的 左半边,然后每次右移一位来和被除数对齐。余数寄存器初始化为被除数。
计算机的算术运算_第4张图片
和乘法类似。
用余数去减除数,刚开始余数的高32位去减除数的高32位,将结果保存在商内。(如果商为1。如果商为0,把余数加回去)。
以此类推,
直到余数的低32位去减除数的32位。

2.改进后的除法器

计算机的算术运算_第5张图片

 除数保持不变,余数的高32位去减除数。

每次减完后左移,将商存在最右侧,实际上,商是从最高位得到的,所以,除数存在一个权值为 2^31。第一次余数的高32位,减去除数,实际上除数的值被增加了2^31得到的商。

 三、浮点表示

1.IEEE754

阶码=指数+127(偏移量)

IEEE754中 阶码的范围为 00000000 ~1111 1111 单调上升,有利于浮点指数对齐比较。

特殊情况:

E=0,M=0 表示+-0;

E=0,M!=0 表示0.M

E=1111 1111,M=0 表示+-无穷大

E=1111 1111,M!=0 表示非数据数,如3/0得到的数据。

你可能感兴趣的:(#,吉大计算机组成原理,c++,硬件工程)