计算机组成原理,从二进制说起

194 阅读7分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

从人类交流语言说起

我们每天都在说话,每天都在用语言交流,但是有没有人想过,语言是怎么产生的?

我是这么理解的,语言,是代称,它的目的,是让交流的双方知道对方在说什么。

比如,花,它是代称,中文里叫花,英文叫 flower, 无论它在各个国家的语言里是怎么代称的,它最终指向的对象是一致的。在一种语言里,如果我们统一了它的叫法,我们就能保障,交流双方提到的内容,指向的对象一致,从而顺畅的完成交流。

那人类的语言和计算机有什么关系呢?


ok。首先我们明确一个问题,计算机需不需要交流?

如果计算机不需要交流,那么,当我们点开一个网站的时候,为什么我们能够查看网站内容,能够去注册登录?当我们打开网站后,我们的电脑从遥远的终端获取内容,这个过程的交流,靠的是人,还是计算机?

很明显,当我们发出指令后,直到得到结果,都是计算机与计算机之间的交流。假设我们输入网址后,按下了回车,我们的计算机要告诉终端(其实也是计算机) 我们要拿什么,终端能够解析信息,把请求需要的返回。

所以计算机需要交流。


计算需要交流,那么就有计算机语言。

计算机毕竟是人类使用的工具,最终服务人类,所以计算机语言要满足以下两点要求:

  1. 能够翻译成人类语言。
  2. 计算机能够读懂。

翻译成人类语言很好办,确定好计算机语言的含义后,我们再进行一次绑定,比如把计算机语言的指代的 ❀,和我们的语言对应起来。那么剩下的工作,就变成了计算机能够读懂。

注:此时,在讨论这一层的时候,它还不能称之为计算机,只能算一个有电机器,我们暂时就称它为 机器语言

可是,怎么创建机器能够读懂的语言呢?人能说话,机器又不能开口,机器有什么?

机器有电,有电压,这样,机器就有状态。比如,高电压,低电压。

假设我们现在有两台机器 ,A 和 B,A 和 B 里面都有两个小灯,我们可以控制每个小灯的电压。

这个时候,我们可以自由创建,我们创建 A 里面两个小灯的状态分别是 高电压|低电压 的时候指代花。(我们用 1 代表高电压,0 代表 低电压)。

那么,这个时候,我们的映射就是 10 - 花。

而我们只要在 B 上控制小灯的电压变成 10,那么 B 就可以表示花。

使用相同的符号,让不同的个体,表达指向了同一个对象,这个时候,我们可以称之为 语言。

微信图片_20220411114217.jpg

机器语言

说了那么多,中心点只有一个。计算机并不能读懂什么字母,它只能读懂控制它电压的信号。

当然了,电压也不是只有高电压和低电压两种,它可以有中电压,中高电压,中低电压等等,我们可以用很多数字去代表它。但是如果分的太密,电压如果有误差,那么就会造成信息传达有误差。

所以目前,我们只用两种状态,1 和 0。

那么现在的问题转化成了: 1.我们怎么用 1 和 0 去完成人类现有语言的组合?

2.怎么设计电路来完成这一切的表达?

首先我们解决第一个问题。

ASCII 码

很明显,如果只有 1 和 0 两种状态,那是远远不够指代世界上的东西的,就算我们有 101010101…… 很多种,然后再出一个对照表,那事情就会变得相当复杂。

我们能不能有有限的东西做无限的组合呢?

什么是有限的? 字母表,也是键盘上的输入字符。

我们用字母组合成词语,做进一步的表达。而我们只需要用 1 和 0 来对照键盘上的输入就可以了。

这就是 ASCII 码 的由来,当然,它是国际通用的。

比如,字母 h 对应的 ascii 码是 0110 1000,i 是 0110 1000,那么只要将它们组合,就变成了

0110 1000 0110 1000 -> hi。

大家可能注意到了,总共有八个 数字,我们可以理解为,我们用了 8 个小灯泡的状态来确定映射表。毕竟 如果只有两个小灯泡, 它的状态只有 10、11、01、00 四种,是远远不够去表达诸多含义的。

如果你翻阅了 ascii 码,你会发现,它里面讲到了字母和特殊字符,但是并没有讲数字。

数字和字符不同,因为数组组合表达出来得可以进行运算。

什么意思呢? 就是说,我们用机器语言表达的数字1,和机器语言表达的数字3,它们相加后,得到的结果得翻译成四。

基于这种需求,我们不能再随意定义数字对应的机器语言,而是要去寻找有规律,能进行运算的语言。

二进制

由于我们暂定电脑中的数字也只能用 1 和 0 来表达,我们引入一个概念,二进制。

说到二进制,你可能对这个名字有点陌生。但是,如果我说,我们现在习惯的 满十进一 的运算方式,叫做 十进制 呢?

那么根据字面意思理解,十进制,就是两个数相加,如果个位数满十,就往十位数(左方向)加一。这样,数字的组成每个单个数字都不会超过 10。

以此类推,二进制就可以理解为,如果两个数相加,得到的数大于二,我们就往左方位进一,这样,数字的单个数字都不会超过 2。

微信图片_20220412105149.jpg

那么我们是不是可以发现,它们之间有些相似呢?

我们知道,数字的目的,依然是为了描述一个对象。

十进制能用来表示数量,那二进制是不是也可以用来表示数量呢?

在十进制中,个位数、百位数、千位数,分别是 10^1,10^2,10^3,我们可以发现 67 、59、126可以表示为:

6*10^1 + 7*10^0
5*10^1 + 9*10^0
1*10^0 + 2*10^1 + 6*10^0

我们可以看到,它有一些规律。它们的次方从右到左分别是 0、1、2,两个数字相加的结果依然可以用同一个方式表达,如果我们把它运用到二进制呢?它符合这样的规律吗?

我们可以试试。以图片中相加为例

1*2^4 + 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 = 27
1*2^5 + 0*2^4 + 1*2^3 + 1*2^2 + 0*2^1 + 1*2^0 = 45
1*2^6 + 0*2^5 + 0*2^4 + 1*2^3 + 0*2^2 + 0*2^1 + 0*2^0 = 72

很明显,我们可以用二进制进行运算!它符合相加的规律。

我们上面的运算过程,其实也可以叫做二进制转十进制,顺着这个思路,十进制也可以转二进制。

这样,计算机可以用二进制进行交流计算,然后转化成十进制,成为我们常用的、熟悉的数字。

其实无论是 27 还是 11011 它们所指代的数量都是一致的,只是表达的形式不一样,就像 花 和 flower 都指代的是 ❀ 一样。

其实,有没有这样一种可能性,我们采用十进制,是因为我们有十个手指呢?(瞎猜的)

结语

通过这篇文章,我们能够大概理解二进制的产生与应用。然后,二进制的思想、简单的小灯泡究竟是如果完成计算的,你可能还不大明白。

想要搞明白它,我们需要简单的电路知识。下章见。

如果觉得对你有用,可以给我点个赞噢~

你的举手之劳,都是对我莫大的鼓励!

\