我们在编写代码的时候经常写到 int a=b+c; a=b-c;a=b*c; a=b/c……对于我们来说,计算加减乘除是一件很简单的事,但对于只认识0、1的计算机来说,它的计算方式显然和我们是不一样的。
今天我们就来了解一下计算机到底是如何进行加减乘除运算的
加法
现在我们有两二级制数A和B,值分别为A=10010001,B=11010011,我们先人工来算一下他的和:
10010001
+11010011
---------------
101100100
我们在人工进行计算时从右往左依次将后两位进行相加,如果有进位则进行进位相加。
其实计算机在实现二进制加法时也是这样逐位相加的,有进位则进位。
我们先来看一下1位二进制数加法表:
-
0 1 0 00 01 1 01 10
仔细看这个一位加法表,在进行一位的加法时只有当两个加数都为1时才会发生进位。我们不妨把结果分为加法位和进位,我们在分别来看一下加法位和进位的情况:
1、加法位
-
0 1 0 0 1 1 1 0
其实这个电路有个专门的名称叫做异或门,只有单两个输入都不相同时输出才为1,符号如下:
实现了加法位我们再来看一下进位
一位加法的的进位结果如下:
-
0 1 0 0 0 1 0 1
看这个表是不是更加眼熟,这不就是我们的与门吗,所有我们只需一个与门就可以实现进位。
减法
机算机只会加法,不会减法,乘法,除法等等。首先,在生活中,自然数是没有限制的,从1到无数,你想说多少就说多少。但是在计算机里,数字不能是无限大,因为保存数字需要空间,就好比在一张纸上,可以写出的数字也是有限的一样。然而这既是缺点,也是优点,这个缺点在计算机的世界里被发扬光大,成了优点。
钟表就是现实生活中的一个例子。24点过后,又是1点。没有25点。25点就是第二天的1点。25点就是 24 + 1点。因为钟表只能容纳24个数,当数到25的时候,24会向前进位,只留下1。这样,我们就说,前面的“24”因“溢出”而丢失。
例如5点加8小时是3点。 5点减去2小时,也是3点
所以,想要计算5 - 2,只要计算 5 + 8就可以了。
5 - 2 = 3; 5 + 8 = 13 (个位相等)
6 - 5 = 1; 6 + 5 = 11 (个位相等)
9 - 3 = 6; 9 + 7 = 16 (个位相等)
通过上面的几个等式发现,减一个数,就是加这个数的补数,然后高位被溢出,剩下的就是结果了。
同理到计算机中,计算机无法读取正负,所以用0、1表示,而补数就是我们所说的补码。
补码
我们知道,计算机中对于有符号数,用最高位作为符号位,“0” 代表 “+” ,“1” 代表 “-” ;其余数位用作数值位,代表数值。比如 Byte 类型的取值范围为 -128 ~ 127。其中,表示数值的只有 7 位,首位表示正负。
怎么推导一个数字的补码呢?补码规定,正数和 0 的补码就是其原码,负数的补码是其正数的原码取反再加 1 。
听起来有点绕,举个例子,求 -10 的补码:
十进制 10 的原码为 0000 1010,
其反码为 1111 0101,
取反后再加 1 即为其补码: 1111 0110。
因此,-10 的补码为 1111 0110。
a = b - c
实际上等同于
a = b + ( -c )
我们算一下下面的式子:
12 - 5
= 0000 1100 + 1111 1011
= (1)0000 0111
= 7
括号中的1为进位,超过8位溢出(类似于始终上的24,计算机中称为模)
7 - 9
= 0000 0111 + 1111 0111
= 1111 1110
= -2(首位的1代表正负)
通过这两个例子是不是就清楚了计算机是如何计算减法的了?
乘法
通过说减法,我们是不是对乘法也有一定的启发了呢?乘法其实就是循环的加法。
乘法的基本计算原理是按照被乘数的低位到高位依次计算,如果第n位不为0,那么乘数就左移n位,如果第n位为0 ,那么这步运算结果记为0,最后将每一步的结果相加就是最终的计算结果。
我们来看一个例子:
除法
除法的道理类似于乘法:
基本原理是按照除数的高位到低位的数字依次和被除数进行比对,如果大于等于被除数,则此步结果记为1,并求得余数,如果小于被除数则将上一步的余数左移一步加上一位的数字再次比较,以此类推,最终将依次计算的结果相连组成二进制就是商,最后一次的余数就是求余的结果。
好啦,到此计算机的加减乘除原理我们就基本看明白啦~~