阅读本文需要 4 分钟
前言
当有人问你1 + 1
等于几的时候,你会觉着这是对你的一种侮辱,这种弱智问题,居然拿来问我。。。。听起来好像你说的没错,1 + 1
是挺简单的,可是如果让你证明的话,可能你这一辈子都证明不出来。。。
稍微知道一点的人,可能会联想到我国著名科学家陈锦润为了证明1 + 1 = 2
,用了几个麻袋的草稿纸的故事,并且最终证明出来了!当然这点是值得我们骄傲的事,但是事实上陈锦润只是证明了1 + 2 = 3
,历史上最著名的猜想:哥赫巴德猜想——1 + 1
为什么等于2
,至今无人证明出来。
我们今天当然不谈怎么证1 + 1 = 2
,我们说的是:你知道在计算机里为什么1 + 1 = 2
吗?
进制问题
众所周知,计算机不像人的大脑,只认识0,1
代码,所有的操作,最后汇聚到计算机底层时,都是0,1
代码.而怎么将人类能识别的数字转化成计算机识别的0,1
代码,计算机又是是怎么将十进制的1,2,3,4,5
转化为二进制的0,1
的呢?
进制转化
科班出身的在遇到进制转化时,都会心中默念四个字:8,4,2,1
。这是什么意思呢?
原来在二进制下,以四个字节为例,1111
,从右往左,第一个1
转化为十进制就是1
,第二个1
转化为10
进制就是2
,第三个1
转换为10
进制就是4
,最后一个就是8
,可以发现第几位出现1
,就意味着转化为10
进制下2
的几次方,同理当有8
字节时,1111 1111
,第八个位置上的1
表示的就是128
。
而十进制转化为2
进制要怎么转换呢?
只需要将10
进制下的数字通过8421
法,来进行一一对应就好了,如7
,转换为二进制就是0111
。
计算机是怎么知道 1 + 1 = 2 的?
在计算机里面,加法是一个很好做的事情,有了加法就不需要减法,因为减法可以看做加上一个负数,所以计算机就只设计了一个加法器,并没有单独设计一个减法器,而乘法和除法对计算机而言,相对来说难度就高很多。
那么问题来了,在加法里面,计算机是怎么表示一个数的负数呢?
前面说到,无论是什么,最终在计算机里面都是0,1
代码,也就是说,寻常意义下的数字1
,在计算机里是一串 0,1
代码,而这里的0,1
代码并不是只是直接的二进制数,在计算机里面,所有数都有三种表达形式:
+1
原码: 1 : 0000 0001
反码: 1 : 0000 0001
补码: 1 : 0000 0001
-1
原码: -1 : 1000 0001
反码: -1 : 1111 1110
补码: -1 : 1111 1111
在计算机中,原码就是转换过来的二进制数,而正数和负数的区别在于最高位,计算机用最高位来当做符号位,0
表示正数,1
表示负数。
正数: 原码 = 反码 = 补码
负数: 反码 = 原码符号位不变,其他位取反,补码 = 反码 +1
理解了数字在计算机中是怎么表示的,就好理解计算机是怎么计算1 + 1
的了。
在计算机中,所有操作数都是以其补码的形式进行计算,若要返回其非二进制的结果,则需要将补码转换为原码,再通过进制转换,转换成理想的答案
+1
补码: 0000 0001
+1
补码: 0000 0001
1 + 1 =
补码: 0000 0010
原码: 0000 0010
转换成十进制:
2
故 1 + 1 = 2
这样才是计算机里面在遇到1 + 1
时进行的底层操作。
而一般的乘法,如简单的偶数倍:
5 × 2
在计算机里都是通过位运算进行计算的,并且位运算的速度非常之快。
+5
补码: 0000 0101
5 × 2 =
0000 0101 << 1 # 将整体向左移一位
补码: 0000 1010
原码: 0000 1010
转化为十进制:
10
故 5 × 2 = 10
可以看到通过位运算,可以快速进行乘法运算。
结语
虽然底层知识基本上是用不到,但是了解一些计算机在底层究竟是怎么运行的,可以帮助我们理解程序在计算机上究竟是怎么跑起来的。
虽然现在轮子是很多,平时也很少会遇到自己造轮子的时候,但是想要成为一个程序员,而非码农,了解一些底层知识,了解如何造轮子是很有必要的一件事。
正如孔子所说:知其然知其所以然。
您的一次关注就足以让我感动!