定点数及定点运算
二进制数据(真值)每相对于小数点左移一位,相当于乘以2;每相对于小数点右移一位,相当于除以2
一、循环移位:所有数据位在自身范围内进行左移或右移,左移时最高位移入最低位,右移时最低位移入最高位
二、逻辑移位:将移位的数据视为无符号数据,各数据位在位置上发生了变化,导致无符号数据的数值(无正负)放大或缩小
三、算术移位:将移位的数据视为带符号数据(机器数)。算术移位的结果,在数值的绝对值上进行放大或缩小,同时 ,符号位保持不变
1.移位规则
符号位不变,对于正数,原码、补码和反码,移位补0;对于负数,原码移位补0,补码左移补0,右移补1,反码移位补1
2.加减法运算(补码加减法运算)
连同符号位一起相加,符号位产生的进位丢掉
(1)加法:
整数 [A]补+[B]补=[A+B]补(mod 2n+1)
小数 [A]补+[B]补=[A+B]补(mod 2)
(2)减法
整数 [A-B]补=[A+(-B)]补=[A]补+[-B]补(mod 2n+1)
小数 [A-B]补=[A+(-B)]补=[A]补+[-B]补(mod 2)
3.溢出判断
(1)单符号位判溢出:参加操作的两个数符号相同,其结果的符号与原操作数的符号不同,即为溢出
V=Cf⊕C0,其中Cf为符号位产生的进位,C0为最高有效位产生的进位
有溢出:1⊕0=1、0⊕1=1;无溢出:0⊕0=0、1⊕1=0
(2)双符号位判溢出(补码加减运算,常用)
X和Y采用双符号位补码参加运算,正数的双符号位为00,负数的双符号位为11,当运算结果的两位符号为01或10时,发生溢出,01为正溢出,10为负溢出
4.乘法运算
(1)原码一位乘运算规则
- 乘积的符号位由两原码符号位异或运算结果决定
- 乘积的数值部分由两数绝对值相乘:被乘数不动,从乘数最低位开始,每一位乘上被乘数,将所得的结果(部分积)与被乘数相加,相加得出的结果算术右移一位,再从比乘数最低位高一位的数字开始如上循环,直至乘数的最高位也计算完毕,得出结果。
进位C、部分积P和乘数寄存器Y
例:x=13、y=-11,求[x•y]原
[x]原=0,1101、x*=1101(为绝对值)、x0=0
[y]原=1,1011、 y*=1011(为绝对值)、y0=1
x0⊕y0=1
x*•y*=0,10001111
[x•y]原=1,10001111
x•y=-143
(2)补码一位乘运算规则(Booth算法)
- 符号位参加运算,被乘数取双符号位,乘数取单符号位,部分积初值为0
- 乘数末尾首先要增加一个附加位0,每次讨论的是乘数的最后两位,但是每次移动是移动一位
- 判断乘数的最后两位,遵循以下规则:为00或者为11的时候,直接右移一位;为01的时候,加[x]补,然后右移一位;为10的时候,加[-x]补,然后右移一位
- 最后一步不用右移一位
例:x=-0.1101、y=0.1011,求[x•y]补
[x]补=11.0011、[-x]补=00.1101
[y]补=0.1011
5.除法运算
(1)原码加减交替法运算规则(不恢复余数法)
- 商的符号位由两数的符号位异或运算取得
- 被除数、除数取绝对值的补码,且取双符号位
- 被除数初始值为[|x|]补,第一步运算用[|x|]补减去[|y|],即加[-|y|]补
- 算出的余数,再次运算加减时,遵循以下规则:当余数为正时,表示够减(商上1)且在进行下一次商时,将余数左移一位,减去除数(+[-|y|]补);当余数为负时,表示不够减(商上0)且在进行下一次商时,将余数左移一位,加上除数(+[|y|]补)
- 操作的步数n,是由要求的n位商决定的,如果第n步余数为负,则需增加一步恢复余数,即+[|y|],增加的这一步不移位
例:x=0.1001、y=-0.1011,求x/y
[|x|]补=00.1001、[|y|]补=00.1011、[-|y|]补=11.0101
(2)补码加减交替法运算规则
- 商的符号由最后的余数符号位判断
- 被除数、除数都是补码,且取双符号位
- 被除数初始值为[x]补,第一步判断除数与被除数的符号,若同号,[x]补减去[y]补,即加[-|y|]补,若异号,[x]补加[y]补
- 算出的余数再与除数[y]补进行比较:同号,商上1,将余数左移一位,减去[y]补,即加[-|y|]补;异号,商上0,将余数左移一位,加[y]补
- 加减次数为n+1,n为商的位数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通