> For the complete documentation index, see [llms.txt](https://3249977074.gitbook.io/os-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://3249977074.gitbook.io/os-notes/ying-jian-bu-fen/how-computer-compute.md).

# 计算机如何计算

## 计算是什么？

个人理解计算就是讲一个或者多个值进行某种操作，得到一个或多个值的过程。

## 哪些东西可以计算

计算器，算盘，计算机等物件都可以计算。简单的加法1+1就是简单的计算。

## 计算机中哪些东西是通过计算得到的。

> 计算机中所有你看到的软件都是计算机通过计算得到的 。——博主

先不必在意计算机是如何计算的，我们将在下一个小节中讨论。我们现在假定计算机能够计算，那为什么计算机能够计算如此多的东西呢？理解这个问题的关键是`编码`，如果你能够理解编码的思维方式那你就理解为什么计算机能够计算这么多东西了。下面举几个例子。

* 字符

  我们可以通过手写表示字母a,b,c，数字1,2,3，汉字一,二,三。那计算机如何表示呢？我们假设如下场景：

  我们给26个字母编号。

  | a | b | c | d | …… | w  | x  | y  | z  |
  | - | - | - | - | -- | -- | -- | -- | -- |
  | 1 | 2 | 3 | 4 | …… | 23 | 24 | 25 | 26 |

  计算机既然能够计算，那计算机一定能够表示数字，那么计算机一定能够表示以上字母了，但是如何像生活中计算机显示器上显示呢？这是显示器的工作，计算机只需要将需要字母的编号发送至显卡，显卡计算好要显示的图形，即每个像素点应该显示什么，然后将其输出到显存里面，显示器从显存里面取得数据，并在屏幕上显示。
* 图形

  图形与字符类似，需要编号的不是字母，而是颜色，你或许已经知道`rgb`这种颜色表示方法，也知道`256`表示黑白灰。RGB即（Red，Green，Blue），它所表示的所有颜色都是通过RGB不同维度的组合表示的，它有三个维度，每个维度有一个字节大小，即8位，总共有24位，所以总共能够表示这些个颜色种类。

  $$
  2^24
  $$

  256表示法即8位从00000000-11111111，即256种颜色，其中全0表示黑色，全1表示白色，其间的所有数字代表不同深度的灰色。

  计算机需要显示图像的时候只需要将这个编码发送至显卡然后经过一系列操作，显示器就能显示图像了。
* 声音

  声音类似，即对不同音调的编码。
* 视频

  视频是图形和声音的组合。

## 计算器是怎么实现计算的

虽然不知道计算器内部是如何构造的，但终究是电子设备，与计算机有相似部分。那计算器是怎么实现计算的呢？

在考虑计算器怎么计算之前，我们先考虑一下自己是怎么计算的。时间回到小学，`1+1=2`，`4+7=11`。为什么`4+7=11`呢？因为它们是10进制数，每一位需要**满十进一**。

再来想一下算盘，算盘是**满五进半，满十进一**。看下图，算盘分两侧，上侧每列两个珠，下侧每列五个珠。所谓满五进半，满十进一就是：每当下侧五个珠满时（全被拉至上方），就需要进半，即上侧两个珠增一（有一个被拉至下方）；如果上侧两个珠满时（下侧两次五个珠满也就是满十），就需要向高一位进一位。整体来看，每一列都是十进制的。算盘的打法不必深入，只需要知道如何计算的就可以了。

![](https://2652865550-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LOl0-RWT_gBnFLAEJ12%2F-LP-3SXjbtmGs0_W1uTM%2F-LP-3T69t8yHsj-V6Lp0%2F%E7%AE%97%E7%9B%98.jpg?generation=1539746948958340\&alt=media)

那算盘是这么计算的，计算器又是如何计算的呢？计算器和计算机也是通过类似的方法计算，只不过用的是二进制，即`满二进一`。十进制我们知道是1,2,3,4,5,6,7,8,9,10,11；二进制也可以类推1,10,11,100,101,110,111,1000,1001,1010,1011。这些值是对应等值的，即下表中每一列是等值的。

| 1 | 2  | 3  | 4   | 5   | 6   | 7   | 8    | 9    | 10   | 11   |
| - | -- | -- | --- | --- | --- | --- | ---- | ---- | ---- | ---- |
| 1 | 10 | 11 | 100 | 101 | 110 | 111 | 1000 | 1001 | 1010 | 1011 |

那么为什么计算器和计算机要用二进制来实现计算呢？因为二进制的计算容易实现，我们要知道计算器是死物，不可能知道1+3=5，但他们能够条件触发两种状态，可以表示为0和1。有了0和1，我们不需要知道1+1=2，只需要知道1+1得到的本位是0，进位为1；0+0本位是0，进位为0；0+1和1+0本位是1，进位是0。即如下表。

|  +  |  0  |  1  |
| :-: | :-: | :-: |
|  0  |  0  |  1  |
|  1  |  1  |  0  |

| carry |  0  |  1  |
| :---: | :-: | :-: |
|   0   |  0  |  0  |
|   1   |  0  |  1  |

如果你了解逻辑门的话，那这些就一目了然了，不过不懂也没关系，我们将在下面的章节中继续讲解。
