其他
CPU 是如何识数的?
作者丨东哥起飞
来源丨Python数据科学(ID:PyDataScience)
先来看一个简单的问题:小孩子都知道数数:1,2,3,4,5,6,7,8,9,10,可为什么要这样数呢?为什么不是1,2,3,4,5,6,10呢?
一种比较流行的解释是因为人类有10个手指:
数字 0 与正整数
0这个数字其实有非常重要的意义,可能大家都没想过这个问题,没关系,我们来看两个不同的数字系统:阿拉伯数字和罗马数字:有符号整数
正整数的表示非常简单,给定 k 个bit,那么我们可以表示 2^k 个数,假设k为4,那么我们可以表示16个数字。如果要考虑有符号整数呢?你可能会想这还不简单,一半一半嘛!其中一半用来表示正数,另一半用来表示负数!假设有4个比特位,如果用来表示无符号正数,就是0 ~ 15,而如果要表示有符号整数,那么其中一半给到+1 ~ +7,另一半给到-1 ~ -7,一切看最左边的 bit 是 0,如果最左边的 bit 位是 0 则表示正数,否则表示负数。方法1:正数加上负号即对应负数
第一种设计方法很简单,既然0010表示+2,那么如果最左边的bit位替换成1就表示对应的负数,即1010表示-2,这种设计方法简单直接,这是最符合人类的思维的设计(不一定最好)。如果这样设计的话,4个 bit 位能表示的所有数字就是:方法2:翻转
你觉得第一种表示方法也就是原码太原始,可以说基本上没什么设计,你突发奇想,既然0010表示+2,那么将其全部翻转,即1101来表示-2好了,即:设计计算机很容易吗?
到这里有的同学可能会想,计算机设计者其实怎么来表示有符号数其实都是可以的,原码可以,反码也可以,都能表示出来,设计计算机太容易了吧!你猜的没错,就是这么容易!如果你是计算机的创造者,怎么设计都可以!最初的计算机设计者真的可以有很多表示数字的方法,采用反码表示数字的计算机系统在历史上真的出现过!!!但这些表示方法不约而同都有一个问题,那就是两数相加。不简单的两数相加
我们以2 + ( -2 )为例。在原码表示法下,2为0010,-2为1010,那么计算机该怎么做2 + ( -2 )加法呢?新的表示方法
现在,对于最左边的bit位来说,0表示正数,1表示负数是没有什么异议的,这里的关键在于我们需要一种表示方法,可以让A+(-A) = 0,而且这里0的二进制也是0,如果是4个bit为的话就应该是0000。假设A=2,那么我们重点研究下2+-2 = 0(0000)的表示方法。对于2来说,很简单就是0010,对于-2来说,现在我们只能确定最左边的bit位是1,也就是说 :CPU真的识数吗?
就像前面提到的,现代计算机采用补码的根本原因在于这种表示方法可以简化电路设计,尽管补码对人类来说不够直观。到这里我们可以看到,在计算机科学中,最符合人类思维的设计并不一定对计算机最优,这也是最迷人的地方,人和机器毕竟不同嘛!让我们再来看下采用补码时2+-2 的计算过程:总结
在本文我们详细讲解了CPU是如何识数这一主题,正如本文所言,CPU其实本质的上是不识数的,也不需要识数,这正是补码这一数字表示方法的优点。希望本文能对大家理解计算机系统的数字表示有所帮助。1、新编辑神器,可以在终端运行 Jupyter Notebook 了!
识别关注我们
了解更多精彩内容
点分享
点点赞
点在看