定点数运算

      本篇文章讨论定点数的运算。因作者水平有限,本文只讨论补码加减运算、原码加减运算、原码1位乘法运算、原码除法。其余运算请参照其他高手的文章。下面我们开始吧!

运算硬件结构:
      在计算机中,加减乘除四种运算实质上是由加法器和移位器组合完成。本文为便于读者了解,在过程中附带了几张进行加减乘除运算的硬件结构图。

      对于无符号数来说,只存在进位借位,溢出没有意义(在此订正:对于无符号数而言,存在下溢,即两个数相减,结果被被减数还要大,即发生下溢。判断条件为CF为1)。对于有符号来说,每次进行运算时都要判断是否发生溢出。

1. 补码加减运算:

      补码加减的运算公式如下:
在这里插入图片描述
      运算部件:
在这里插入图片描述
      运算部件介绍:

         X,Y为两个输入,其中Y为加数,X为被加数。

         Sub代表是否具有减法运算(sub为1时为减法,为0时为加法)。 ZF(zero flag)代表结果是否为零(ZF为1时结果为0,为0时结果非零)。

        OF(overflow flag)代表是否发生了溢出(OF为1是溢出,为0时未溢出)。注意此位对于带符号运算有意义,无符号运算无意义。

        SF(sign flag)代表结果的符号(SF为1代表负数,为0代表正数),注意此位对于带符号运算有意义,无符号运算无意义。

        CF(借/进位 flag)代表无符号数运算是否发生进位(加法)、借位(减法)。(CF为1代表加法有进位,减法有借位,为0代表运算正常)。 注意此位对于无符号运算有意义,带符号运算无意义。

      对于补码加减法而言,将加数和被加数全部转换成补码进行运算即可,(减法转变成加上相反数的补码)。重点在于对是否溢出做判断。无符号数的加减可以看作是正数补码的加减(对于正数来说,补码为其本身,并没有改变数值,但此处不是十分确定,欢迎高手批评指正),故也能使用这种运算部件来判断。

       设运算数为a,b和为c:
      一个比较简单的方式就是:由于前后加减运算要求位数相同,如果a,b的符号位均为0或1,而c的符号与两者相反,则此时一定发生溢出。(通俗的解释就是正数加正数结果不可能为负数,负数加负数(负数减正数)结果也不可能为正数)。但计算机不能像人类这样直观的判断,它凭借的还是前文所介绍运算结构的输出,凭借以下两种逻辑表达式进行判断:
在这里插入图片描述
      下面结合一个具体例子进行分析:
在这里插入图片描述
      C(n)代表符号位进位,也是最高位进位,若未进位则此位为0。C(n-1)代表非符号最高位进位,若未进位为0。这两个例子满足两个逻辑表达式。

2. 原码加减:

      原码加减没有补码加减应用广泛,原码加减主要应用在浮点数做加减。原因是浮点数的尾数使用原码表示。本文主要介绍定点数,对此贴张图说明运算规则即可:
在这里插入图片描述

3. 原码1位乘法:

      运算结构如图:
在这里插入图片描述
      运算结构介绍:初始化被乘数在寄存器X中,对于N乘N来说结果是2N位。乘积寄存器P存储结果高32位,寄存器Y原存储乘数后存储结果低32位。

      值得注意的是对于乘法运算来说,任意一个乘数为0结果为0.所以在正式运算开始之前会进行一个预判,若有任意一个为0,则直接结果设置为0。同时两个n位数相乘,所得结果为2n位。运算结束后,高n位为0表示正常,只保留低n位作为乘积结果。如果高n位不为0,则表示n位运算溢出。

      结果的符号位由乘数及被乘数的符号位异或运算可得。本文主要介绍最终结果是如何得到的。

      手写的过程如下:
在这里插入图片描述
      根据手写的规律看,随着每位的乘法,结果不断向左移。

      在计算机执行中,做了相应的一点改变以优化效率。为了减少对于过程中变量的存储,选择了保留部分积,即每次运算都在上一步得到的结果上进行操作。同时对变左移为对部分积的右移。若乘数位为1则加上被乘数后进行右移,若乘数为0则直接进行右移。下面结合一个具体的例子来进行分析:
在这里插入图片描述
      例题中可知,符号位C即为和的进位,同时也作为P右移的补位,P中最低位进入Y中作为最高位。本题中只有四位,所以右移四位即可。在实际计算机中,右移的位数由计数器控制。

4. 原码除法:

      除法有规定,除数不能为零。所以计算机在执行过程中会先进行一个预处理,判断如果除数为0,对于定点数来说C语言中会直接抛出异常。如果被除数为0,则直接输出0。商的符号位是由两数符号位异或操作获得。
       下面附带一章代码实例运行的图说明定点数除数不可为0问题(输出为空,抛出异常):
在这里插入图片描述
      运算结构如图:
在这里插入图片描述
      运算结构介绍:

         为了保证结果和输入位数相同,对被除数做扩张至位数为2n。除数存储在寄存器Y中,余数和商作为最终结果存储在一起。在扩展的过程中如果是整数,在高位添加n个0。如果是小数,在低位添加n个0。(一定要记住,不要搞反)
         在手算除法中,每步都要进行一次尝试,看目前的结果能否足够除以除数,够除商上1并将两数做减。不够除上0,除数右移。称之为“上商”。具体手算过程如图:
在这里插入图片描述
      在计算机中,原除数右移变为固定除数而被除数左移。所以整个过程由加法和左移两部分完成。

      计算除法大致方法分为两种:恢复余数法和加减交替法。两种方法从原理上看,是相同的。只是对等式做了变形。下面对两种方法进行具体介绍:

1)恢复余数法:

      当部分商与除数做减后小于0,说明当前部分上不够减需要向左移。那么先将减去的除数加回来恢复上一步的部分商再左移。如此循环下去,直到左移位数达到除数的位数即止。下面根据一个具体例子来进行分析:
在这里插入图片描述在这里插入图片描述
      本题是两个小数之间进行除法运算,包括符号位共有5位,做扩展即在低位扩展5位。当每次和符号位为1时,则恢复余数后左移。整体共左移4次,最后一位补位即可不需左移。

2) 加减交替法:

      加减交替法是根据部分商的正负决定是加Y还是减Y,当部分商小于0时则加Y,当部分商大于零时则减Y。这里的部分商指的是移位之前的部分商。每次进行完加法后先进行移位,在加或者减,下面结合上文提到的例子来分析:
在这里插入图片描述
      在本例中每次加法过后,则进行加Y/减Y。最终四次移位五次补位后得到结论。

      在本文末尾介绍一下异常:
异常不同于BUG,是无法被编译器检验出来的。会通过不合理的输出反应。异常出现的几种情况:
      1)定点数运行时产生除零的情况
      2)需要打开的文件不存在
      3)数组访问时越界
      对异常部分参照博客:https://blog.csdn.net/small_prince_/article/details/80533159link

      本文介绍的定点数运算至关重要,它直接关系到浮点数的正常运算。只有理解定点数,才能更好的明白浮点数。加油呦~
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值