zoukankan      html  css  js  c++  java
  • 【计算机组成】运算器与运算方法

    定点数运算及溢出

    • 定点数加减法:减法化加法,用补码直接相加,忽略进位
    • 溢出:运算结果超出了某种数据类型的表示范围
    • 溢出检测方法:统一思想概括为正正得负或负负得正则溢出,正负或负正不可能溢出
      • 方法1:V = XYS + XYS(XY为两个加数的符号位,S为结果的符号位,_表示非),那么V = 1则为溢出
      • 方法2:V = C0 ⊕ C1(C0是最高数据位产生的进位,C1是符号位产生的进位),那么V = 1则为溢出
      • 方法3:V = Xf1 ⊕ Xf2(数据采用变型补码 Xf1Xf2 X0X1X2X3... )

    注意:以上方法都是利用正正得负负负得正则溢出为出发点的电路设计

    补码一位乘法——Booth算法

    [ egin{align} [x·y]_补 & = [x]_补·(-y_0+∑ y_{i}2^{-i}) \ & = [x]_补·[ -y_0 + y_{1}2^{-1} + y_{2}2^{-2} + … + y_{n}2^{-n}] \ & = [x]_补·[ -y_0 + (y_{1} - y_{1}2^{-1}) + (y_{2}2^{-1} - y_{2}2^{-2}) + … + (y_{n}2^{-(n-1)} - y_{n}2^{-n})] \ & = [x]_补·[(y_1 - y_0) + (y_2 - y_1) 2^{-1} + … + (y_n - y_{n-1}) 2^{-(n-1)} + (0 - y_n)2^{-n}] \ end{align} ]

    总结起来设计数字电路的规则就是:

    • 为 00 或者为 11 的时候,直接右移一位
    • 为 01 的时候,加 x 的补,然后右移一位
    • 为 10 的时候,加 -x 的补,然后右移一位

    其实第一行和最后一行都能设计数字电路,为什么要从第一个式子推到最后一个式子呢?原因有两点:

    • 二进制中如果有 0,可以不进行运算
    • 如果有连续的 1 可以减少计算次数,比如 (a * 001111100 = a * (010000000 - 0000000100))

    所以每次判断 (y_{n+1} - y_{n}) 就可以减少计算次数了

    参考:https://www.cnblogs.com/xisheng/p/9260861.html

    定点数除法

    略,没找到好的资料

    浮点数加减法

    1. 求阶差,阶码小的对齐大的
    2. 尾数加减
    3. 结果规格化
  • 相关阅读:
    设计模式天天练。
    系统资料库msdb置疑或者不可用的解决方法
    依赖注入IOC
    重载、重写、隐藏的区别
    ASP.NET中的HttpWorkerRequest对像及其应用
    ASP.NET的错误处理机制
    Web.Config
    asp.net 2.0页面生命周期
    FileUpLoad控件上传大容量文件
    大文件上传
  • 原文地址:https://www.cnblogs.com/blknemo/p/12811116.html
Copyright © 2011-2022 走看看