1.为什么学习编程基础
因为你首先是程序员,其次才是前端,如果希望在这条路上走得远,编程基础是一定要学习的。
一个程序员需要知道
- 硬件与软件:计算机的运行原理(《编码》)
- 最大的软件:操作系统(操作系统)
- 自己写软件:数据结构 & 算法(《数据结构与算法分析》),大概需要半年的时间才能读完,快速学习需要学习排序算法
- 多人写软件:软件工程(《代码大全》)
2.前端为什么要学习编程基础
- 操作系统运行与硬件之上
- 浏览器运行于操作系统之上
- HTML/CSS/JS运行于浏览器之上
- HTML/CSS/JS和数据都来自于服务器
防止变成井底之蛙
3.计算机:二进制世界
1110 0100 1011 1101 1010 0000 1110 0101 1010 0101 1011 1101
上面一行数据就是“你好”在计算机里的表示方式
第一步:(内存)如何存储0和1?
-
内存一般边上有几个卡槽,中间一般是有四到八个方块,每个方块里面有很多个0和1的机关,一个机关可以想象成很多个原点,一个原点就是一个电池;
- 电池一般是8个一排,如图红色代表是存满电,白色代表没电。
- 现选中竖向的一列,即竖向为一列输电,横向的8条管道再对这选中的一列8个点进行输送电量。当为1的时候则充电,当为0的时候则是不充电。然后再进行第二排充电
- 电池存在一个耗电的过程,日常的电池持久有点的原因是因为其转化为化学能,但是在这边是不行的,因为太小了,使用晶体管做的,里面不能再塞其余东西了,所以耗电也是很快的。充电一般是几纳秒(10的-9次方)就可以充满,冲完之后一般是几毫秒就耗完了,所以如果说断电后,系统就得黑掉,运行在内存中的操作系统就没有了。
- 为了解决上面这个耗电问题,计算机就要刷新,红点就是1,在电耗完之前就要重新充电,一般CPU有一个参数叫多少HZ( 赫兹),这个的意思就是每秒钟能充多少次电
第二步:如何存储数字
十进制的数字怎么转换成二进制
- 正整数
37(十进制) = 1 * 2^5 + 0 * 2^4 + 0 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 100101(二进制) - 负整数:计算机只能存0和1,负号是不能存的,为了完美的存储负数,使用一套叫补码(使用0和1存储符号)的规则
-37(十进制) = -100101(二进制) - 小数:小数将以浮点数的形式存储,将以十分之一为底的数字转换成以二分之一为底的数字,即可转为二进制
0.75(十进制) = 0.11(二进制)
0.75 = 7 * 1/10 + 5 * 1/100 = n1 * 1/2 + n2 * 1/4 + ... = 0.5 + 0.25 = 1 * 1/2 + 1 * 1/4 = 0.11(二进制)
但是又会有一个问题,计算机只能存储0和1,这个小数点怎么存?
这就需要使用浮点数规则
第三步:如何存储字符
将所有字符进行编号呢?
ASCII码是美国人发明的,共编号128个字符
- 通常我们为了书写方便,会将二进制转为十六进制,所谓转成十六进制,就是将二进制四位放一起转成数值。
十六进制(简写为hex或下标16)在数学中是一种逢16进1的进位制。一般用数字0到9和字母A到F(或af)表示,其中:AF表示10~15,这些称作十六进制数字。
a(字符) -> 0110 0001(二进制)-> 61(十六进制)
1(字符1) -> 0011 0001(二进制) -> 31(十六进制)
第四步:如何存储中文
国标2312
微软整的GBK字符集(国标扩展字符集)
第五步:如何存储所有字符
有一个组织叫Unicode联盟,Unicode的意思就是统一编码
问题:2^16为65536,已经明显不能满足128237个的存储量了,该怎么办?
由原来的216转为232(4294967296)位
第六步:如何将Unicode存储到计算机里面
- 比如存储a,以前ASCII的时候只要使用8位就存储结束了,你这个汉字,只要使用16位就存储结束了,现在明显浪费了很多内存,即所有中文翻2倍,英文翻4倍
- UTF-8将想着将多余的空间省略,但是这样是不行的,因为计算机没法分辨到底存的是几位字符,并且没法判断哪几个是一起的,哪几个是单独的
-
对于16位的,如下图所示,我们将16进制分成三部分,第一部分保留原16进制的1-6位,第二部分保留原16进制的7-12位,剩下的13-16位放到第三部分,每一部分前面都留出东西在
- 第三部分前面四位为1110,三个1一个0,表示计算机读的时候要往后读三个字节,并且后面每个字节的开头都是10,也就是第一部分和第二部分前面10的标识代表我是跟着最前面这个字节的,除了第一部分前两个,第二部分前两个,第三部分前四个之外的,才是真正存储的字符
- 对于a -> 01100001,最前面一个1都没有,所以其是一个单字节,双字节前面一定是两个1,三字节前面一定是三个1
UTF-8是Unicode存到计算机上面的一种算法,是一种编码方式,不是字符集
- 当只需要7位存储的话,直接在七位前面加个0就可以存储了
- 如果是8-11位,则是以第二种方式存,这种形式开头一定是110,即两个字节,后面字节以10开头
- 如果是12-16位,则以第三种方式存,这种形式开头一定是1110,即三个字节,后面两个字节以10开头
即有几个字节就以几个1加一个0开头,然后后面的字节肯定是以10开头的,汉字一般是两个字节或者三个字节,UTF-8是为了解决Unicode费空间的问题