定点加减运算(补码加减法及溢出检测)

本文只针对定点的加减运算(补码加减法实现),不涉及定点数的乘除运算以及浮点数运算

补码加减法

  1. 公式
    1. 补码加法: [x+y]=[x]+[y] [ x + y ] 补 = [ x ] 补 + [ y ] 补
    2. 补码减法: [xy]=[x]+[y] [ x − y ] 补 = [ x ] 补 + [ − y ] 补
      注意: [y]=[y] [ − y ] 补 = [ y ] 补 包括符号位取反且最末位加1,这里的取反是包括符号位的,与求反码的不同
  2. 例子
    1. 例1: x=-0.1011,y=0.0111,求 [x+y] [ x + y ] 补
      [x]=1.0101 [ x ] 补 = 1.0101
      [y]=0.0111 [ y ] 补 = 0.0111
      [x+y]=[x]+[y]=1.0101+0.0111=1.1100 [ x + y ] 补 = [ x ] 补 + [ y ] 补 = 1.0101 + 0.0111 = 1.1100
    2. 例 2: x=+0.11011,y=-0.11111,求 [xy] [ x − y ] 补
      [x]=0.11011 [ x ] 补 = 0.11011
      [y]=1.00001 [ y ] 补 = 1.00001
      [y]=0.11111 [ − y ] 补 = 0.11111
      [xy]=[x]+[y]=1.11010 [ x − y ] 补 = [ x ] 补 + [ − y ] 补 = 1.11010

溢出检测

  1. 概念:
    在定点整数机器中,数的表示范围为 |x|<(2n1) | x | < ( 2 n − 1 ) ,若运算的过程中出现大于此字长绝对值的现象,则称之为”溢出”
    但n位二进制补码数的表示范围是 2n1 − 2 n − 1 2n11 2 n − 1 − 1 ,详见https://blog.csdn.net/alinyua/article/details/79702879
  2. 可能出现溢出的情况:
    1. 两正数加,变负数,上溢(正溢)(大于机器所能表示的最大数)
    2. 两负数加,变正数,下溢(负溢)(小于机器所能表示的最小数)
  3. 检测方法

    1. 双符号位法
      1.参与加减运算的数采用变形补码表示(正数的两个符号位是”00”,负数的两个符号位是”11”,尾数规则同补码)
      2.连同符号位参与运算
      3.根据两个符号位判断结果是否溢出(机器中用异或门判断)

      符号位SF1符号位SF2结果
      00正确(正数)
      01上溢
      10下溢
      11正确(负数)

      例子:x=-1100,y=-1000,求x+y
      [x]=110100 [ x ] 补 = 110100
      [y]=111000 [ y ] 补 = 111000
      [x]+[y]=101100 [ x ] 补 + [ y ] 补 = 101100
      由于两个符号位出现”10”,表示下溢

    2. 单符号位法

      1. 连同符号位参与运算
      2. 分别求符号位产生的进位 Cf C f 和最高有效位产生的进位 C0 C 0
      3. 根据 Cf C f C0 C 0 判断结果是否溢出(机器中用异或门判断)
      符号位进位 Cf C f 最高位进位 C0 C 0 结果
      00正确(正数)
      01上溢
      10下溢
      11正确(负数

关于原码,反码,移码的概念和计算参考https://blog.csdn.net/alinyua/article/details/79702879

  • 8
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值