本文主要是介绍原码、补码的乘除法总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
CPU里的寄存器位数都是统一的
0、运算器的基本组成
包括如下几个寄存器:
- ACC:累加器,用于存放操作数,或运算结果
- MQ:乘商寄存器,在乘、除运算时,用于存放操作数或运算结果
- X:通用的操作数寄存器,用于存放操作数
- ALU:算术逻辑单元,通过内部复杂的电路实现算数运算、逻辑运算
一、原码一位乘法
设机器字长为n+1=5位(含1位符号位,n=4)。x=-0.1101,y=+0.1011
- 符号位:不参与运算,通过异或单独确定
- 数值位:通过被乘数和乘数绝对值的n轮加法、移位完成
- 根据当前乘数中参与运算的位确定(ACC)加什么
- 若当前运算位为1,则 ( A C C ) + [ ∣ x ∣ ] 原 (ACC)+[|x|]_原 (ACC)+[∣x∣]原
- 若当前运算位为0,则 ( A C C ) + 0 (ACC)+0 (ACC)+0
- 每轮加法后,ACC、MQ的内容统一逻辑右移
- 根据当前乘数中参与运算的位确定(ACC)加什么
二、补码一位乘法
设机器字长为n+1=5位(含1位符号位,n=4)。x=-0.1101,y=+0.1011。则 [ x ] 补 = 1.0011 , [ − x ] 补 = 0.1101 , [ y ] 补 = 0.1011 [x]_补=1.0011,[-x]_补=0.1101,[y]_补=0.1011 [x]补=1.0011,[−x]补=0.1101,[y]补=0.1011
- 寄存器中数的存放:被乘数采用双符号位补码,乘数采用单符号位补码(因为MQ的最后一位会用来存放“辅助位”)
- 辅助电路:被乘数所在的寄存器会连着一个辅助电路,用来将其中存放的x的补码转换成-x的补码,然后将其送往ALU
- 符号位:参与运算,详见下数值位
- 数值位:通过被乘数和乘数进行n轮加法、移位和多加一次加法,来完成的
- 根据当前辅助位- MQ“最低位”的值确定(ACC)加什么
- 辅助位- MQ“最低位”=1时: ( A C C ) + [ x ] 补 (ACC)+[x]_补 (ACC)+[x]补
- 辅助位- MQ“最低位”=0时: ( A C C ) + 0 (ACC)+0 (ACC)+0
- 辅助位- MQ“最低位”=-1时: ( A C C ) + [ − x ] 补 (ACC)+[-x]_补 (ACC)+[−x]补
- 每轮加法后,ACC、MQ的内容统一进行“补码的算数右移”
- 最后再多来一次加法
- 根据当前辅助位- MQ“最低位”的值确定(ACC)加什么
三、原码、补码的除法运算
除法类型 | 符号位参与运算 | 加减次数 | 移位方向(被除数->余数) | 移位次数 | 上商、加减原则 | 说明 |
---|---|---|---|---|---|---|
原码加减交替法 | 否 | n+1或n+2 | 左 | n | 余数的正负 | 若最终余数为负,则需要恢复余数 |
补码加减交替法 | 是 | n+1 | 左 | n | 余数和除数是否同号 | 商末位恒置1 |
这篇关于原码、补码的乘除法总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!