pythonav.com
首页
知识库
免费视频
项目实战
每天20道面试题
登录
注册
本节教大家计算机常识知识,平写代码虽然不常见,但很多东西的内部都是基于这些知识点来实现的,即:进制、单位、编码。 ## 1. 进制 ### 1.1 初识进制 谈到进制相信大家都不陌生,因为我们在上小学的时候老师就教会我们大家:满10进位。 今天咱们一起来了解下搞IT的程序员常说的几种进制: - 二进制,满二进位 - 八进制,满八进位 - 十进制,满十进位 - 十六进制,满十六进位  从上面的进制关系对照表可以发现,不同进制之间其实就进位的时机不同,分别:满2、8、10、16进位。按照不同进制在表示同个数值时,会出现不同的值,例如:常说的数字14(十进制)用不同进制表示分别为: ``` 二进制:1110 八进制:17 十进制:14 十六进制:e ``` ### 1.2 进制的作用 进制之间是什么以及进制之间的关系大家搞明白了,但紧接着问题也来了,计算机是不是有毛病,搞这么多进制干嘛?就用咱们大家熟悉的十进制多好,非要搞出这么多进制来。 哈哈哈,每个刚开始学编程的同学都会有这样的疑问,接下来我就来给大家一点点解释。 - 关于十进制:在计算机诞生前,我们所有的计算都是通过人脑来实现。所以我们从小就开始学习数学,例如:12345678910、1+1=2等,其实就是十进制。把人类的大脑都培养成懂得十进制运算,这样人与人之间进行交流时候,就可以快速相互交换信息了。 - 关于二进制:计算机诞生,人类创造计算机就是为了模拟人脑来进行一些操作,但计算机被创造出来时只能懂得二进制,也就是一大堆的01010等,所以我们平时在计算机上想要实现 `8 + 13 = 21`功能,在计算机的内部会将它转换为二进制`1000 和 1101`之间的计算,本质上计算机中的一些行为都是以二进制来实现。 - 关于八进制:计算机中对数据另一种表示形式,一般写代码用不到,可暂忽略。(某些设备或PIC编码等场景有用到)。 - 关于十六进制:由于计算机中本质上存储的都是二进制,一般在表示二进制时会使用十六进制,因为他用更短内容可以表示的数据更多,例如:二进制 100010001000101 用十六进制表示只需要 `4445`即可。 注意:计算机是由很多二极管组成,可以把二极管看成 灯,灯亮表示1;灯不亮表示0,计算机内部运行本质就是通过这种形式实现。其实也类似于古时候打仗,多个烽火台上的火把有没有被点亮,点亮的每一个火把都代表了不同的含义。  ## 2. 计算机中的单位 由于计算机中本质上所有的东西以为二进制存储和操作的,为了方便对于二进制值大小的表示,所以就搞了一些单位,例如:流量还有多少M、硬盘容量有1T、计算机8G内存等、宽带是200M、千兆网络等。 计算机中表示对于二进制大小的常见单位有: - b(bit),位 ``` 表示二进制有多少位,例如: 01101 就是 5位 = 5b 011011010 就是 9位 = 9b ``` - B(byte),字节 ``` 8位就是1个字节,例如: 10100101 就是 8位 = 8b = 1B= 1个字节 1010010110100101 就是 16位 = 16b = 2B= 2个字节 ``` - KB(Kilobyte),千字节 ``` 1024个字节就是1千字节(1KB),即: 1 KB = 1024 B = 1024*8 b ``` - M(Megabyte),兆 ``` 1024个千字节就是1兆(1M),即: 1M = 1024 KB = 1024 * 1024 B = 1024 * 1024 * 8 b ``` - G(Gigabyte),千兆 ``` 1024个兆就是1千兆(1G),即: 1G = 1024 M = 1024 * 1024 KB = 1024 * 1024 * 1024 B = 1024 * 1024 * 1024 * 8 b ``` - T(Terabyte),万亿字节 ``` 1024个G就是1T ``` - ...其他更大单位 PB/EB/ZB/YB/BB/NB/DB 不再赘述。 学完上面的这些单位之后,是不是就了解了平时大家说的自己有1G流量是啥意思了。
做个小练习
:假设1个汉字需要2个字节(2B=16位来表示,如:1000101011001100),那么1G流量可以通过网络传输多少汉字呢?(计算机传输本质上也是二进制) ``` 解答: 已知 1G = 1024 MB = 1024 * 1024 KB = 1024 * 1024 * 1024 B 且 2B表示一个汉字。 所以 1024 * 1024 * 1024 / 2 = 536870912,即:1G流量可以传输536870912个汉字。 ``` ## 3. 编码 我们知道计算机中所有的数据本质上都是以二进制存在,那么在计算机上写的 文字、符号、字母、数字 等最终都会需要转化为二进制,然后再去执行二进制。 ### 3.1 ascii编码 全世界第一台计算机是在美国诞生,诞生之初计算机只能支持英语,也就是说只能支持 符号、字母、数字,不支持:汉语、日语、汉语、泰语等,由于计算机本质上全部都是二进制操作,所以当时做了一张 字符 和 二进制的对照表(ascii编码)。  通过上图可以发现: - ascii码表中的256个对应关系,足以支持所有的英文操作了 ``` ascii码规定用8位来表示一个字符。因为每一位有0/1两种可能,8位就可以支持256种可能,即: 从 0000000、00000001、00000010 ~ 11111111 有256个,ascii就是这些二进制和字符来做的对应关系。 ``` - 表中没有展示出二进制,按顺序仅分别显示了 十、十六、八进制,如果包含二进制关系的话,分别应该有: ```python 二进制 十进制 00000000 0 00000001 2 ... 11111111 255 ``` > 注意:ascii码中的 `0 ~ 9` 指的不是数字而是字符串`"1"、"2"..."9"` 与 二进制的对应关系。例如: - 获取整数9对应的二进制时,直接通过 十进制和二进制的关系转换,即:1001 - 获取字符串"9"对应的二进制时,直接通过ascii码去找,即:00111001。 ### 3.2 unicode字符集 由于ascii码只能表示256中字符对照关系,无法表示其他国家的文字,所有为了能让计算机支持全世界任意的文字就搞出来了一个unicode(字符集),他为全世界已知语言的所有字符都分配了一个码位(相当于是一个身份证ID),码位本质上也是个二进制。 读到这里,你可能会感觉unicode字符集 和 ascii编码一样,但其实字符集和编码还是有区别,如下: - ascii编码,直接是字符和二进制的对照表,此二进制可在计算机中用于 `内存计算`、`硬盘存储`、`网络传输`等。 ``` 字符 二进制 a 01100001(十进制97;十六进制61) b 01100010(十进制98;十六进制62) ``` - unicode字符集,是字符和码位的对应关系,码位本质上也是二进制,此二进制可在计算机中用于`内存计算`,但一般不会做`硬盘存储`和`网络传输`(为什么呢?下面有讲解)。 ``` 字符 码位(ID) a 00000000 01100001(十进制97;十六进制61) b 00000000 01100010(十进制98;十六进制62) 武 01101011 01100110(十进制27494;十六进制6B66) 갵 10101100 00110101(十进制44085;十六进制AC35) ``` - utf-8编码,是对unicode字符集的码位进行转换处理得到的二进制,此二进制可用于 `内存计算`、`硬盘存储`、`网络传输`等。 ``` 字符 码位(ID) utf-8编码(可以对码位进行加工处理) a 00000000 01100001(十进制97;十六进制61) 01100001 b 00000000 01100010(十进制98;十六进制62) 01100010 武 01101011 01100110(十进制27494;十六进制6B66) 11100110 10101101 10100110 갵 10101100 00110101(十进制44085;十六进制AC35) 11101010 10110000 10110101 注意:这样一来utf-8编码的二级制和字符就生成了一个间接的对照表。 ``` 初步了解ascii编码、unicode字符集、utf-8编码关系之后,接下来对每个小点在进行解释。
**接下来重点说unicode字符集**
,我们知道unicode字符集中包含了全世界所有的字符和码位的对应关系,这其中码位至关重要,因为码位必须足以支持全世界的字符。 - 起初unicode字符集固定使用2个字节来表示码位,即:ucs2。 ``` ucs2用2个字节表示码位,所以码位能表示从 0000000000000000 至 1111111111111111 共 2**16=65525种可能,同时意味着ucs2能表示65535个字符。 用十六进制表示这个范围的话就是:0000 ~ FFFF。 ucs2中字符和码位的对应关系参见:http://www.columbia.edu/kermit/ucs2.html ``` - 后来unicode使用4个字节表示所有字符,即:ucs4。 ``` 因为随着时间的推移,发现的字符越来越多,这65535不够用了。 所以就有了ucs4,他使用固定4个字节表示码位,码位就可以表示 2**32 = 4294967296 种可能,范围如下: 二进制表示 00000000 00000000 00000000 00000000 ~ 11111111 11111111 11111111 11111111 十六进制表示 00000000 ~ ffffffff ucs4中字符和码位的具体对应关系参见: https://unicode-table.com/en/#00A5 https://www.unicode.org/charts/ ``` 截止2019年5月unicode已收集137929个字符,也就说ucs4还没被占满,如果发现其他的文字还可以继续扩增。 注意:ucs4其实是对ucs2的一个扩展,ucs4默认使用4个字节表示码位而ucs2用2个字节表示码位。 对于ucs2的65535个码位,ucs4会在ucs2表示的码位前加 0,即:`ucs2:01101011 01100110` 变为 `ucs4:00000000 00000000 01101011 01100110`; 对于第65535后面的码位,则ucs4在ucs2基础上在进行扩增(图2和图3)。 图1:  图2:  图3:  写在最后,一般情况下用ucs2可以满足常见的文字,但如果想要表示更全/更多的话,肯定选择ucs4,并且现在越来越多的人都开始选择使用ucs4,例如:想要在系统中支持emoji图标,肯定要支持ucs4。 ucs4的优缺点: - 缺点:因为都使用4个字节表示码位,同样的字符的码位会更占空间。所以,计算机中再`网络传输`、`硬盘存储`时都不会用unicode字符集的码位存储,而是把码位转换(压缩)成utf-8等编码的二进制再进行传输和硬盘存储。 - 优点:可以表示所有字符并且长度固定4字节,方便内存中进行数据计算(不必担心太占用内存空间,因为内存占用的计算的数据一般不会太大)。 注:网络传输指的是通过网络发送一段文字等消息; 硬盘存储指的是把一些文档等信息保存到硬盘上。 ### 3.3 utf-8编码 在上面讲unicode字符集时,有简单提到过:utf-8编码其实就是对unicode字符集的码位进行压缩加工处理得到的,把二进制码位中不必要位去掉。这样一来,utf-8既可以表示所有的字符,又可以进行 内存计算、网络传输、硬盘存储了,所以,这也是为什么utf-8编码可以在全球的广泛的应用。 总感觉utf-8是站在巨人unicode肩膀上功成名就的!!! utf-8,是一套以 8 位为一个编码单位的可变长编码。会将一个码位编码为 1 到 4 个字节,对于码位进行编码时分为两步: - **第一步**:根据码位选择转换模板 ``` 码位范围(十六进制) 转换模板 0000 ~ 007F 0XXXXXXX 0080 ~ 07FF 110XXXXX 10XXXXXX 0800 ~ FFFF 1110XXXX 10XXXXXX 10XXXXXX 10000 ~ 10FFFF 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX 例如: "B" 对应的unicode码位为 0042,那么他应该选择的一个模板。 "ǣ" 对应的unicode码位为 01E3,则应该选择第二个模板。 "武" 对应的unicode码位为 6B66,则应该选择第三个模板。 "沛" 对应的unicode码位为 6C9B,则应该选择第三个模板。 "齐" 对应的unicode码位为 9F50,则应该选择第三个模板。 注意:一般中文都使用第三个模板(3个字节),这也就是平时大家说中文在utf-8中会占3个字节的原因了。 ``` - **第二步**:码位以二进制展示,再根据模板进行转换 ``` 码位拆分: "武"的码位为6B66,则二进制为 0110101101100110 根据模板转换: 6 B 6 6 0110 1011 0110 0110 ---------------------------- 1110XXXX 10XXXXXX 10XXXXXX 使用第三个模板 11100110 10XXXXXX 10XXXXXX 第一步:取二进制前四位0110填充到模板的第一个字节的xxxx位置 11100110 10101101 10XXXXXX 第二步:挨着向后取6位101101填充到模板的第二个字节的xxxxxx位置 11100110 10101101 10100110 第二步:再挨着向后取6位100110填充到模板的第三个字节的xxxxxx位置 最终,"武"对应的utf-8编码为 11100110 10101101 10100110 ``` 除了utf-8之外,其实还有一些其他的 utf-7/utf-16/utf-32 等编码,他们跟utf-8类似,但没有utf-8应用广泛。 ## 4. 总结 本章的知识点属于理解为主,了解这些基础之后有利于后面知识点的学习,接下来对本节所有的知识点进行归纳总结: 1. 计算机上所有的东西最终都会转换成为二进制再去运行。 2. ascii编码、unicode字符集、utf-8编码本质上都是字符与二进制的关系。 - ascii,字符和二进制的对照表。 - unicode,字符和二进制(码位)的对照表。 - utf-8,对unicode字符集的码位进行压缩处理,间接也维护了字符和二进制的对照表。 3. ucs2和ucs4指的是使用多少个字节来表示unicode字符集的码位。 4. 目前最广泛的编码为:utf-8,他可以表示所有的字符且存储或网络传输也不会浪费资源(对码位进行压缩了)。 5. 二进制、八进制、十进制、十六进制其实就是进位的时机不同。 6. 一个字节8位 7. b/B/KB/M/G的关系。
用户评论
登录
或
注册
后才能发表评论
目录
学前必备
第一章 环境搭建
第二章 快速入门
第三章 Python基础
第四章 进制和编码
第五章 数据类型(一)
第六章 数据类型(二)
第七章 数据类型(三)
第八章 总结和考试题
第九章 实战案例
第六章 文件操作
第七章 函数
迭代器
生成器
装饰器
模块
开发规范
面向对象
附赠:vs code 环境搭建
回复