2.运算方法和运算电路
大约 8 分钟
一、基本运算部件
- 运算器由算术逻辑单元 ( Arithretic Logic Unit, ALU)、移位器、状态寄存器和通用寄存器组等组成
- 运算器的基本功能包括加、减、乘、除四则运算,与、或、非、异或等逻辑运算,以及移位、求补等操作
- 核心部件是加法器
标志位
- 溢出标志:
- 符号标志就是和的符号:
- 零标志 当且仅当
- 进位/借位标志
ALU 是一种功能较强的组合逻辑电路,它能进行多种算术运算和逻辑运算。核心是带标志加法器
二、定点数的移位运算
1.算数移位
| 码制 | 添加代码 | |
|---|---|---|
| 正数 | 原码、反码、补码 | 0 |
| 负数 | 原码 | 0 |
| 负数 | 补码 | 左移添0,右移添1 |
| 负数 | 反码 | 1 |
三种机器数移位后符号都不变
2.逻辑移位
逻辑移位的操作数视为无符号数
左移:高位丢失,低位添0
右移:低位丢失,高位添0
3.循环移位
带标志位的循环移位(大循环)和不带标志位的循环移位(小循环)
不带进位位的循环左移将最高位进入最低位和标志寄存器C位。
三、定点数的加减运算
1.补码的加减法运算
注意
其中 等于连同的符号位取反+1,计算的结果是补码
溢出判断
双符号位也称为模4补码,运算结果两符号位相同,表示未溢出,否则溢出,此时最高位代表真正的符号位
| 结果 | |
|---|---|
| 00 | 正数,无溢出 |
| 01 | 正溢出 |
| 10 | 负溢出 |
| 11 | 负数,无溢出 |
,无溢出;,溢出
设符号位的进位、最高数据位的进位
,未溢出;,溢出
2.原码的加减法运算
加法:先判断符号位,相同则绝对值相加符号位不变,不同做减法,绝对值大的减小的,符号和绝对值大的相同
减法:将减数符号取反在做加法运算
左边位出现溢出时,溢出位丢掉
3.无符号数加减运算
在计算机内,无符号数的加减运算同有符号数一样,也是转换为补码进行运算,只是最后对于结果的解释不一样
// 情形一
unsigned A, B;
A = 0;
B = 1;
A - B;
则运算为
只不过最后的结果是按照无符号数来解释,那么最后的结果就是FFFFFFFFH
// 情形二
int A, B;
A = 0;
B = 1;
A - B;
此时结果仍为FFFFFFFFH,但是按照有符号数来解释,结果就是-1(真值)
四、定点数的乘除运算
1.定点数的乘法运算
乘法运算可以由累加和右移位实现
手算乘法的本质
手算时的移位本质上就是为了便于中间结果进行求和,错位是因为不同结果的权不一样

原码一位乘[2]
符号位和数值位分开求,符号位由两个数的符号位亦或形成,乘积部分是两个数的绝对值相乘之积
运算步骤如下:
- 被乘数和乘数都取绝对值参与运算,且符号位由两个数的符号位亦或形成
- 部分积是乘法过程的中间结果。乘数的每一位乘以被乘数,该结果和前面所得的结果(部分积)累加,其中部分积初值是0
- 从乘数的最低位开始判断,若,则部分积加上被乘数,右移一位,否则部分积加上0,右移一位
- 重复步骤3,判断次。其中右移和加法都是判断次
注
部分积和乘数做加法的过程中,可能存在部分积溢出的情况,但是此时并非溢出,所以部分积和乘数采用双符号位[3]
例子:

补码一位乘(BOOTH算法)
步骤如下:
- 运算数的符号参与运算,都以补码表示,最终符号的结果由运算所得
- 被乘数取双符号位,部分积也取双符号位,初值为0,乘数取单符号位
- 在乘数末尾增设附加位,初值为0
- 再根据:
- 结果为0,部分积加上0
- 结果为1,部分积加上
- 结果为-1,部分积加上。
- 部分积右移一位
- 算法进行步操作,累加次,右移次
例子:

两者的区别

2.定点数的除法运算
除法可以转换成累加+左移(逻辑左移)
原码除法
恢复余数法
加减交替法(不恢复余数法)
- 减法操作用补码实现,符号由两个操作数符号异或形成
- 被减数减去除数,余数为正(说明够除),上商1,余数和商左移一位,再减去除数;为负,上商0,余数和商左移一位,再加上除数
- 当步余数为负时,需要加上除数得到正确的除数,即不恢复余数法仅当最后一步不够减的时候才恢复余数
- 次移位,次加法
补码除法(加减交替法)
- 符号位和数值位一同运算
- 根据被除数和除数符号决定做加法还是减法
- 上商根据余数和除数符号决定,同1,左移减除数,异0,左移加除数[4],最后一步商恒置1(所以会有一定误差)
- 次移位,次加法
数据的存储和排列
数据的“大端方式”和“小端方式”存储
例如,在 32 位计算机中,一个int 型变量i的机器数为 01 23 45 67H,其最高有效宇节MSB =01H,最低有效宇节LSB=67H。

- 大端方式按从最高有效字节到最低有效字节的顺序存储数据,即最高有效字节存放在前面;
- 小端方式按从最低有效字节到最高有效字节的顺序存储数据,即最低有效字节存放在前面。
数据按“边界对齐”方式存储
- 假设存储字长为 32 位,可按字节、半字和字寻址。对于机器字长为 32 位的计算机,数据以边界对齐方式存放,半字地址一定是2的整数倍,字地址一定是4 的整数倍,这样无论所取的数据是字节、半字还是字,均可一次访存取出。所存储的数据不满足上述要求时,通过填充空白字节使其符合要求。这样虽然浪费了一些存储空间,但可提高取指令和取数的速度。
- 数据不按边界对齐方式存储时,可以充分利用存储空间,但半字长或字长的指令可能会存储在两个存储字中,此时需要两次访存,并且对高低字节的位置进行调整、连接之后才能得到所要的指令或数据,从而影响了指令的执行效率。

