计算机进行加减法

计算机的加减法操作都是以八个比特也就是一个字节为单元的 超过一个字节的数值的操作 要把数据以一个字节为单位划分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

原文地址:https://www.cnblogs.com/china8036/p/4306294.html