计算机的加减法操作都是以八个比特也就是一个字节为单元的 超过一个字节的数值的操作 要把数据以一个字节为单位划分N个数据来操作
1 加法
二进制只有 0 和 1 两个数相加的情况
A | B | 结果 | 进位 |
---|---|---|---|
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