前言
我想问大家一个问题:二进制、八进制、十进制、十六进制究竟是计算机中才有的概念,还是可以脱离计算机仅仅作为数学概念而独立存在呢?
答案是后者,如果你不曾想过这个问题,你也就大概不能十分清晰的理解计算机对于数字与字符的存储。
为了更加清晰的阐述文章,我想要先给大家讲一下各种进制到底怎么回事。
各种进制的本质
大家需要先了解一个老生常谈的概念,却很本质,如下:
- 二进制是满2进1
- 八进制是满8进1
- 十进制是满10进1
- 十六进制是满16进1
什么叫做进1呢?
如果我有6个苹果,问我苹果个数,回答:6
如果我有9个苹果,问我苹果个数,回答:9
6和9都只有1个数字,而一个数字最大只能表示:9个苹果
如果我有9个苹果,你有1个苹果,问我们共有几个苹果,回答:10
10是两个数字,9+1超过了一个数所能表示的最大范围,需要两个数表示
9和1也可以用两个数表示,为:09和01,故9+1需要进1,指的是向高位进1
这就是十进制进一的意思,相信大家都明白。
二进制如何进1?
二进制是满2进1,十进制满10就要进1了,最大的个位数是9;二进制满2就要进1了,最大个位数是1。
如果我有1个苹果,问我苹果个数,二进制回答:1
如果我有1个苹果,你有1个苹果,问我们总共有几个苹果,二进制回答:10
二进制的10就是十进制的2.
十进制3如何用二进制表示?
3就是十进制意义里的2即10加上二进制意义里的1。
10 + 1 =11, 故二进制11就是三个苹果的意思。
二进制如何进行加法?
如下图:
只需遵循满2向高位进1即可,与十进制运算本质上一致。
在现实世界中,我们习惯用数学上的十进制来描述,其实也可以用二进制来描述。例如我们可以说,有3个十进制的苹果,也可以说是有11个二进制的苹果。
在这里,你要明白,数学上我们有多种描述数量的方式,最常用的是十进制方式,也可以用二进制、八进制和十六进制去描述现实世界的数量,它们描述的意思都是一样的。只是不同的进制的运算是不同的,例如二进制满2进1。
数学上二进制如何转换为十进制、八进制与十六进制的技巧性算法,不是本文的重点,但是掌握各种进制转换会对你有所帮助,你可以先花10分钟去学习一下各种进制转换的技巧。
数学上二进制11,就是十进制3。可是作为只认识二进制的计算机如何处理数字3呢?
计算机如何处理十进制数字
当我们输入十进制的数字3,编译器会将十进制3转换为二进制11,然后将二进制11存储到计算机中。
也就说在编译器中有一张表,如下:
十进制 | 二进制 |
0 | 0 |
1 | 1 |
2 | 10 |
3 | 11 |
4 | 100 |
5 | 101 |
6 | 110 |
7 | 111 |
8 | 1000 |
9 | 1001 |
10 | 1010 |
11 | 1011 |
12 | 1100 |
...... | ...... |
当输入十进制5时,编译器根据5对应的二进制是101,从而将101送入计算机。
如果编译器中这张表十进制5,对应的是二进制10,就会将10送入计算机;如果编译器中这张表十进制5,对应的是二进制1100,就会将1100送入计算机;所以说,,当你输入数字5,最终送入计算机中的二进制是什么,完全取决于设计编译器的时候,那张表中十进制5对应的二进制数字是什么。
计算机只认识二进制数字,不认识十进制数字,当输入十进制数字时,我们可以用二进制数字去代表这个十进制数字。也就是说哪怕你用二进制11(数学意义为十进制3),去代表十进制5,从而让你在输入十进制5的时候,编译器将二进制11送入计算机也可以。说的再浅显一点,这张表中二进制与十进制的对应规则,是人为制造的,可以采用数学意义的对应规则,也可以随便自定义规则。只不过事实上,我们采用的对应规则,确实是数学意义上的规则罢了。
当我们输入十进制的3+3,编译器会根据表,先将第一个十进制3转换为二进制11,再将先将第一个十进制3转换为二进制11,然后进行二进制11与二进制11的加法计算,得到二进制110。然后将二进制110送入显示器,在送入显示器的过程中也有一张表,如下:
二进制 | 十进制 |
0 | 0 |
1 | 1 |
10 | 2 |
11 | 3 |
100 | 4 |
101 | 5 |
110 | 6 |
111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | 10 |
1011 | 11 |
1100 | 12 |
...... | ...... |
二进制110送入显示器的过程中会根据这张表,将二进制110,转化为十进制6,然后我们就在屏幕上看到6了。同样的道理,这张表也可以自定义。只不过事实上,我们采用的对应规则,确实是数学意义上的规则罢了。这张二进制转化为十进制的表和上面十进制转化为二进制的表肯定规则一致,否则不就乱套了
这两张表都采用数学意义上的规则来定义,就可以实现十进制的加法。而绝对不是,现实世界中十进制3+十进制3=十进制6,计算机中就必须二进制11+二进制11=二进制110。换句话说,绝对不是人脑根据数学上描述现实世界的实际意义,认为十进制3,就是二进制11;然后计算机就直接认为十进制3,就是二进制11。但是有一点不变,人脑怎么算加法,计算机就怎么算加法。基于这个,我们只需要根据十进制与二进制数学上的对应关系建立一张表,让计算机根据这张表去进行十进制与二进制直接的对应,就可以实现计算机认为十进制3,就是二进制11。从而实现正确对应,实现正确的加法运算。
对应其它进制与其它运算,都是同一个道理。
计算机如何处理字符与ASCII码表
计算机底层存储的只有0和1,不存在任何其它的东西。那么如何来输入输出字符呢?
跟如何输入输出十进制数字是同样的道理,我将二进制数字与字符也建立一张对照表就可以了。比如我建立一个表如下:
二进制 | 字符 |
1000001 | A |
1000010 | B |
1000011 | C |
1000100 | D |
如果我输入字符A,编译器会根据这张表,将其转化为二进制1000001,并将二进制1000001送入计算机。这张表也是自定义的,上述十进制与二进制的对应表,为了计算方便,在定义的时候采用了现实世界的数学逻辑,而字符与二进制的对应表你可以认为就是随便定义的,没啥逻辑。国际上定义了一个字符与二进制的通用对应表。这个表就是ASCII码表。下图就是这个表就是ASCII码表的一部分:
注意:二进制太长了,表中用十进制来代表二进制的值。举个例子,ASCII码表65,你就可以看做二进制的1000001。
计算机如何分辨底层二进制代表了什么
刚才讲到了十进制65,在计算机底层用二进制1000001来存储,
又讲到了字符A,在计算机底层也用二进制1000001来存储,
那到底计算机底层中的二进制1000001表示的是65还是A呢?
这取决于你的操作。
举个例子:此时计算机底层已经存储了二进制100001
让计算机显示65,此时你可以命令计算机,让计算机将二进制送入显示器的过程中,按照二进制转换为十进制的那张表,让二进制1000001转换为十进制65。
让计算机显示A,此时你可以命令计算机,让计算机将二进制送入显示器的过程中,按照二进制转换为字符的那张表,让二进制1000001转换为字符A。
我用C语言代码。模拟以下这个过程:
相比此时你对计算机如何储存数字和字符,与各种进制的本质,与ASCII码,理解的更加透彻了。
标签:11,字符,进制,10,二进制,苹果,ASCII,十进制,计算机 From: https://blog.csdn.net/2301_81570594/article/details/143267733