定点数及定点运算

二进制数据(真值)每相对于小数点左移一位,相当于乘以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)原码一位乘运算规则

  1. 乘积的符号位由两原码符号位异或运算结果决定
  2. 乘积的数值部分由两数绝对值相乘:被乘数不动,从乘数最低位开始,每一位乘上被乘数,将所得的结果(部分积)与被乘数相加,相加得出的结果算术右移一位,再从比乘数最低位高一位的数字开始如上循环,直至乘数的最高位也计算完毕,得出结果。

  进位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算法)

  1.  符号位参加运算,被乘数取双符号位,乘数取单符号位,部分积初值为0
  2. 乘数末尾首先要增加一个附加位0,每次讨论的是乘数的最后两位,但是每次移动是移动一位
  3. 判断乘数的最后两位,遵循以下规则:为00或者为11的时候,直接右移一位;为01的时候,加[x],然后右移一位;为10的时候,加[-x],然后右移一位
  4. 最后一步不用右移一位

例:x=-0.1101、y=0.1011,求[x•y]

[x]=11.0011、[-x]=00.1101

[y]=0.1011

5.除法运算

(1)原码加减交替法运算规则(不恢复余数法)

  1. 商的符号位由两数的符号位异或运算取得
  2. 被除数、除数取绝对值的补码,且取双符号位
  3. 被除数初始值为[|x|],第一步运算用[|x|]减去[|y|],即加[-|y|]
  4. 算出的余数,再次运算加减时,遵循以下规则:当余数为正时,表示够减(商上1)且在进行下一次商时,将余数左移一位,减去除数(+[-|y|]);当余数为负时,表示不够减(商上0)且在进行下一次商时,将余数左移一位,加上除数(+[|y|]
  5. 操作的步数n,是由要求的n位商决定的,如果第n步余数为负,则需增加一步恢复余数,即+[|y|],增加的这一步不移位

例:x=0.1001、y=-0.1011,求x/y

[|x|]=00.1001、[|y|]=00.1011、[-|y|]=11.0101

 

(2)补码加减交替法运算规则

  1. 商的符号由最后的余数符号位判断
  2. 被除数、除数都是补码,且取双符号位
  3. 被除数初始值为[x],第一步判断除数与被除数的符号,若同号,[x]减去[y],即加[-|y|],若异号,[x]加[y]
  4. 算出的余数再与除数[y]进行比较:同号,商上1,将余数左移一位,减去[y],即加[-|y|];异号,商上0,将余数左移一位,加[y]
  5. 加减次数为n+1,n为商的位数
posted @   Dgutdada  阅读(203)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示