• 【计算机组成原理】定点加减法运算


    数据在计算机中是以一定的编码方式表示的,常用的编码有原码、反码、补码和移码。同一种算术运算使用不同的编码,有不同的运算法则。对不同机器码特点的分析可知,采用补码表示数据,符号位可以与数值位一起参与运算,还可以将减法转换成加法。采用定点补码加减法进行运算具有运算规则简单、易于实现等优点。

    目录

    一、补码加减法的运算方法

    1. 补码加法 

    2. 补码减法 

    二、溢出及检测 

    1. 溢出的概念 

    2. 溢出的检测 

    附:相关内容


    一、补码加减法的运算方法

    1. 补码加法 

    补码加法的运算:[x]补+[y]补=[x+y]补

    例1:设x=0.1010,y=0.0101,求 [x]补+[y]补 。

    先将真值x和y转换成由补码数据表示:

    x[补]=0.1010,y[补]=0.0101

    利用补码加法公式可得:

           [x]补     0.1010

         +[y]补     0.0101 

    [x+y]补         0.1111

    所以:x[补]+[y]补=0.1111 

    例2:设x= -0.1010,y= -0.0100,求 [x+y]补 和 x+y 。

    先将真值x和y转换成由补码数据表示:

    [x]补=1.0110,[y]补=1.1100

    利用补码的加法公式可得:

           [x]补     1.0110

         +[y]补     1.1100 

    [x+y]补      11.0010

    符号位进位的值为模数,应该舍弃,所以:[x+y]补=1.0010,x+y= -0.1110

    2. 补码减法 

    补码减法运算公式:[x-y]补=[x]补+[-y]补=[x]补-[y]补

    例3:设x=0.1001,y=0.0110,求 [x]补-[y]补 。 

    [x]补=0.1001,[y]补=0.0110,[-y]补=1.1010

           [x]补     0.1001

        + [-y]补    1.1010

    [x-y]补        10.0011

    符号位进位的值为模数,应该舍去,所以:[x]补-[y]补=0.0011

    例4:设x= -0.1001,y= -0.0110,求 [x]补-[y]补 和 x-y 。

    [x]补=1.0111,[y]补=1.1010,[-y]补=0.0110

           [x]补     1.0111

        + [-y]补    0.0110

    [x-y]补         1.1101

    所以:[x]补-[y]补=1.1101,x-y= -0.0011 

    二、溢出及检测 

    1. 溢出的概念 

    我们通过两个实例来观察溢出的现象:

    (1)设[x]补=0.1011、[y]补=0.1100,求[x]补+[y]补。

    (2)设[x]补=1.0101、[y]补=1.0100,求[x]补+[y]补。

    对于(1):两个正数相加,运算结果是负数,显然是错误的

           [x]补     0.1011

        + [y]补     0.1100

    [x+y]补         1.0111

    对于(2):运算结果舍去了模数,两个负数相加结果成了正数,运算结果同样是错误的

           [x]补     1.0101

        + [y]补     1.0100

    [x-y]补       10.1001 

    由于计算机字长是确定的,能表示的数据范围也是有限的,溢出现象不可避免。而溢出很有可能导致有效数字丢失或直接导致错误的运算结果,因此,计算机系统设计者必须解决溢出的判断问题,以便溢出发生时计算机能做出相应的处理。  

    2. 溢出的检测 

    主要利用变形补码的符号位进行检测:

    变形补码即用两个二进制位来进行数据的符号表示。正数的符号以“00”表示,负数的符号以“11”表示。一般称左边的符号位为第1符号位,右边的符号位为第2符号位,第1符号位永远代表正确的符号位。补码加减法的运算公式对变形补码仍然成立,若运算结果的符号位为“01”或“10”,则分别表明发生了正上溢和负上溢。 

    例1:设[x]补=00.1011,[y]补=00.0111,求[x]补+[y]补。

           [x]补   00.1011

        + [y]补   00.0111

    [x-y]补       01.0010

    运算结果的符号位为“01”,第1符号位代表正确符号位,运算发生了上溢 

    例2:设[x]补=11.0101,[y]补=11.0011,求[x]补+[y]补。

           [x]补   11.0101

        + [y]补   11.0011

    [x-y]补       10.1000

    运算结果的符号位为“10”,第1符号位代表正确符号位,运算发生了下溢

    例2:设[x]补=00.1011,[y]补=11.0011,求[x]补+[y]补。

           [x]补   00.1011

        + [y]补   11.0011

    [x-y]补       11.1110

    运算结果的符号位为“11”,运算未发生溢出

    由此可见,当运算结果的双符号位相同时无溢出,相异时溢出。

    不论是否溢出,第1符号位永远与真实的符号位一致。 

    附:相关内容

  • 相关阅读:
    我爱上了这个网站
    git实用技巧:把我的文件内容改回去
    中心差分法-学习笔记《结构动力学-陈政清》
    Unity UGUI开发规范
    leetcode算法题--数值的整数次方
    网页数据抓取工具推荐:简数采集器
    三维模型表面积计算方法
    OpenCV2 module ‘cv2‘ has no attribute ‘legacy‘
    【Linux】swap有什么用?如何建立swap分区?
    浅析kubernetes中client-go Informer
  • 原文地址:https://blog.csdn.net/m0_68111267/article/details/127681821