zoukankan      html  css  js  c++  java
  • 计算机进行加减法

    计算机的加减法操作都是以八个比特也就是一个字节为单元的 超过一个字节的数值的操作 要把数据以一个字节为单位划分N个数据来操作

    1 加法 

    二进制只有 0 和 1  两个数相加的情况

    AB结果进位
    1 0 1 0
    1 1 0 1
    0 0 0 0
    0 1 1 0

    上图为一个字节加法器的实现 低位的的进位输出作为下一位的进位输出 总的进位输出 放到一位锁存器里面 以便后续以每个字节为单元进行进位相加操作

    下图所示为4位16进制(16位二进制) 进行加法运算示意图  每个数据分类 低8位和高8位 第一个数据的低8位 先与第二个数据的低8位相加 结果和进位储存起来

    然后再把两者的高8位和低8位的进位相加起来 结果存出来 拼起来就是两个数值的和(如果整体有进位的话 会被抛弃

    2 减法 进行减法时候必须注意的就是:低位不够减要向高位借位,这个实现起来就比较复杂 但是有个办法可以不借位实现减法

                                              

    253-176 = 256 + 999-176 + 1-1000;

    999-176  叫做176 的十进制补码  同理二进制的减法也可以进行此操作 也就是而且只8位最大数位11111111 补码的求法相当于用1减去位上的数值 也就是如果是1 此为取补后1-1=0  如果是0取补后位1-0=1 也就是二进制的补码 就是此数值每位取反 所以两个数如果进行减法操作 输入端只要取法就行

    多个字节的减法同加法相似 也要考虑进位因为加法是减数的补码相加 所以低字节结果是由有进位可能的

    3 总结  

    1 如果两个不同长度数值相加系统会先较短的的前补0到与长的等同 一边划分量相同的 8位数相加

    2 数值相加是可能进位的 但是按照上面的理论 比如你加两个16位数 每个16位数 分成两个8位数(低位 和 高位) 低位进位输出可以放到高位的进位输入里 但是最高位的进位输出呢放到哪里?显然最高位的进位无法存储 所以加到 11111111 11111111  再加1 就会变为 00000000 00000000 这就是程序的溢出 

                                                                               The Hidden Language of Computer Hardware and Software 读后笔记 @wang

  • 相关阅读:
    关于ArcGis for javascrept查询ArcGis server图层信息的方式
    Elasticsearch教程之基础概念
    C# 将日期转换成中文格式
    .Net 自定义Excel模板导出数据
    JavaScript判断浏览器类型
    简单的json传送数据
    Oracle替换临时表空间
    Python多线程循环
    crontab执行不生效-【问题篇】
    Python将MySQL表数据写入excel
  • 原文地址:https://www.cnblogs.com/china8036/p/4306294.html
Copyright © 2011-2022 走看看