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

  • 相关阅读:
    Angular Universal 学习笔记
    SAP Spartacus 如何获得当前渲染页面的 CMS 元数据
    Angular 服务器端渲染的学习笔记(二)
    Angular 服务器端渲染的学习笔记(一)
    第三方外部 Saas提供商如何跟使用 SAP 系统的客户进行对接接口集成
    如何从 SAP Spartacus Product Detail 页面,找到其 Angular 实现 Component 的位置
    具备自动刷新功能的 SAP ABAP ALV 报表
    C++学习目录
    c--条件编译
    c--文件读写--二进制
  • 原文地址:https://www.cnblogs.com/china8036/p/4306294.html
Copyright © 2011-2022 走看看