- 背景提要
1)计算机为什么不支持减法?
计算机以二进制保存数据,高压电流表示1,低压电流表示0,
0+0时,低压电流+低压电流,输出低压电流,所以0+0=0;
0+1时,低压电流+高压电流,输出高压电流,所以0+1=1;
1+1时,高压电流+高压电流,输出特高压电流,当检测到特高压电流时,将向下一根电路中输出高压电流,同时本电路输出低压电流,所以1+1=10,二进制10表示2;
从计算机设计开始,就不准备计算减法操作,因为无法输入负电流,同时也不支持反方向输入电流,从设计之初,就只设计了加法器,没有减法器,那么他是如何计算减法的呢?
2)计算机如何表示负数
符号位:数字在计算机中以二进制机器数进行保存,例如 00000011 代表3,100000011 代表-3,机器数的最高位代表符号位,0代表正数(+),1代表负数(-);
- 原码、反码、补码
- 原码
正数:同二进制一致,符号位为0
负数:同数的绝对值的二进制一致,符号位为1
正数: 1 -> 原[00000001]
负数:-1 -> 原[10000001]
- 反码
正数:与原码一致
负数:在原码基础上,符号位不变,其他位取反
正数: 1 -> 原[00000001] -> 反[00000001]
负数:-1 -> 原[10000001] -> 反[11111110]
- 补码
正数:与原码一致
负数:在反码基础上,加1
正数: 1 -> 反[00000001] -> 补[00000001]
负数:-1 -> 反[11111110] -> 补[11111111]
- 数字在计算机中存储过程
数字在计算机中存储过程图
- 模拟计算机减法操作
计算机在计算减法操作时,通过减一个数,就是加一个数的负数的方式,统一转换为加法操作。
1)举例 1 - 1
1 - 1 = 1 + (-1)
-> 原[00000001] + 原[10000001]
-> 反[00000001] + 反[11111110]
-> 补[00000001] + 补[11111111]
= 补[00000000] = 原[00000000] = 0
2)举例 3 - 2
3 - 2 = 3 + (-2)
-> 原[00000011] + 原[10000010]
-> 反[00000011] + 反[11111101]
-> 补[00000011] + 补[11111110]
= 补[00000001] = 原[00000001] = 1
3)举例 -3 - 2
-3 - 2 = -3 + (-2)
-> 原[10000011] + 原[10000010]
-> 反[11111100] + 反[11111101]
-> 补[11111101] + 补[11111110]
= 补[11111011] = 原[10000101] = -5
- 总结
1)二进制最高位表示符号位,正数位0,负数为1
2)正数的原码、反码、补码一致,三码合一
3)负数原码除符号位,取反得反码,反码加1得补码
4)两数相减相当于一个数加另一个数的负数 = 一个数的补码加另一个数的补码
5)计算机保存时,保存的是补码,计算也是按照补码计算的,结果也为补码,需转换为原码