一:CPU运算器中,只有加法器
CPU运算器里面,只有加法器,加法器电路相对于减法器来说要简单很多,成本就少很多,受硬件资源限制,主要是为了精简硬件.
从数学角度,减法是可以转换成加法运算的。乘法同样可以转换成加法运算,除法可以转换成乘法运算,所以一切的运算都可以以加法运算为基础,所以CPU只会做加法也没有问题。
二:如何将减法转换成加法运算
1.纠正一个误区
举个例子 ,3减2 和 3加(-2)
比如我要做减法,3减2,将减法转换成加法,很容易想到,3加(-2),这不是将减法转换成加法运算,细想一下,我们在做3加(-2)的时候,还是将3加(-2)转化成了3减2来计算,所以3加(-2)本质还是在做减法.
2.那么如何将减法转换成加法运算呢?
将减法转换成加法运算首先了解模的概念:
“模”是指一个计量系统的计数范围.
时钟的计量范围是12,模=12
当前时钟,指向3点, 要想调整时钟到1点,有两种方法:
(1)倒拨2小时,即 3-2 = 1 点
(2)顺拨10小时, 即 3+10 = 12(溢出) + 1 = 1 点
在以12模的系统中,减2和加10,效果都一样,因此凡是减2的运算,都可以用加10来替代,我们称 -2和 10互为补数
一个负数可用它的正补数来代替,而这个正补数可以用模加上负数本身来得到。
所以将减法运算(加负数),转换成加法运算,是加负数的补数.
正数的补数为其自身,(加正数,是在做加法,不需要转换.)
计算机只有加法器,将减法转成加法运算的道理与此相同
三.十进制VS二进制
在计算机中,由逻辑电路组成,逻辑电路通常只有两个状态,开关的接通与断开,这两种状态正好可用“1”和“0”表示,所以计算机使用二进制进行运算.所以在理解计算机将减法转换成加法运算之前,还要了解一下二进制.
十进制: 逢十进一,只有0-9共十个符号,个位数最大为9,需要表示十这个数量时,就要从个位跳到高位的地方记1,同时个位补上0
0,1,2,3,4,5,6,7,8,9,10(十)
二进制: 逢二进一,只有0,1两个符号,个位数最大为1,需要表示二这个数量的时候,就要从各位调到高位的地方记1,同时个位补上0
0,1,10(二),11(三)
从图中可以看到,一个8位二进制数,普通正常编码,可以表示的数为 -127~127,其中还有0和-0
而在计算机中1个字节(8位)表示的范围是-128到127,根本没有0和-0的概念,那么-0哪里去了? -128又是哪里来的,1个8位的二进制数根本无法表示-128,最小的数是-127,而计算机中1个字节确可以取值-128.
显然计算机虽然使用的是二进制运算,但并不是采用普通正常二进制进行编码.
四:计算机减法转加法运算:
计算机将减法转成加法运算,和时钟加补数的道理一样,就是加负数的补码的形式.
如图详述:
如图所示得出结论:
补码解决的问题:
1.减法运算转换成加法运算(通过负数转成补码再做加法运算,正数的补码是本身,整数就是做加法,不需要转换)
2.符号位参与运算(负数的补码是负数)
3.0和-0的问题(下面介绍)
所以求补码的方法:
1:正数:与原码相同。
2:负数:求负的补码,求负整数的补码,将其原码除符号位外的所有位取反后加1,符号位为1不变
扩展:-128的补码是谁?
8位二进制数没法表示-128,所以没法算-128的补码?
求补码的方法是根据模的概念推到出来的,本质还是减法转加法的模的理念,
回溯一下模的概念.
模为12的钟表, 减2 和 加10 一样, 减3 和 加9一样, 那么减12呢? 和加0一样.所以-12的补数是0
同理:
补码解决了符号位参与运算的问题,补码都是负数.
8位二进制数,模为128
-1 的 补码 -127
-2 的补码 -126
-127的补码 -1
-128的补码 -0
五:0和-0
如果计算机采用普通正常二进制进行编码,然后在运算的时候,转换成补码运算,原码就会0和-0
0的补码是0,而-0的补码是-128, 在一个8位的二进制数,-128无法表示,最小数是-127,然而做减法的运算,是将负数转成补码,加补码的形式运算,是补码在参与运算.而不是原码 , -0的补码是负128, -128没办法表示,没办法参与运算,那么-0就没有意义了,就浪费了.
计算机参减法操作,实际是通过加补码的形式
如果直接采用补码对数字进行编码,那么所有的减法运算,就是加补码的运算了,运算时就无需转成补码了.