编码-隐匿在计算机软件背后的语言
为什么阅读这本书?
- 大部分学习计算机的人可能都知道,计算机之父是冯诺伊曼,在早一点的可能说是图灵,人们习惯了用它去进行一些复杂的计算,用各种计算机语言去写一些程序帮助人们计算。这本书就是脱离了Windows,Mac,Linux系统之外来告诉你计算机本质的工作原理,帮助你更好的理解你写的代码。
什么是电?
- 所有脱离了电的电子产品都是砖头,拿什么是电呢?众所周知,物质是由
原子(atom)
组成的,它又是由:中子(neutron)
,质子(proton)
,电子(electron)
组成,其中中子(中性)和质子(+)形成了原子核, 在原子核内的质子因为一种叫做强力的力而束缚在了一起,这种力要大于同性电荷之间的斥力,这种力可能会引起原子核的裂变,从而产生核能。电子(-) 则通过异性相吸的引力环绕在原子核的周围,通常,质子和电子的数量都是相同的,因此处于最稳定的状态,如果失衡的话,它们会进行自我修复,从其他地方获取电子来达到自身平衡的状态。当电子不断的从一个原子逃逸到下一个相邻原子的过程,就形成了电流。生活中的闪电和静电就是这个原理。
学名 | 单位 | 公式 |
---|---|---|
电压/V | E/伏/电势能 | E=I*R |
电阻 | R/欧姆 | R=E/I |
电流 | I/安培 | I=E/R |
功率 | P/瓦特 | P=E*I |
认识电报机和继电器
- 一个电池+一根缠绕了导线的铁棒,就能组成电磁铁,这就是电报机的基础,接通电源后,电磁铁有了磁性,断开电源,磁性消失,根据磁铁的反应就能获取到信息,但由于电线越长,电阻越大,所以不能无线延长,所以每隔一段距离就需要一个人来转发收到的信息,因此就有了继电器的出现,继电器替代的人力按下按钮的作用,合理的使用继电器甚至可以搭建一个计算机出来。
布尔代数
-
顾名思义,就是一个叫布尔的天才发明的一种代数,他的天才之处就是吧代数从数字抽象了出来,操作的不是数字(num),而是类(class),是不是有点像JAVA,一个类就是一个事物的群体,也被称之为集合(set)。
交集 并集 全集 空集 */\(\bigcup\)/and/串联 +/\(\bigcap\)/or/并联 1 0 摩根定律:
门
与门 | ![]() |
---|---|
或门 | ![]() |
非门/反相器 | ![]() |
与非门 | ![]() |
或非门 | ![]() |
缓冲器/继电器 | ![]() |
异或门 | ![]() |
同或门 | 两端相同为1,不同为0 |
二进制加法器
-
本书讲解的是靠门电路来实现
八位加法器
,异或门
来存储加和输出
,与门
来保存进位
,与门
与异或门
合并成为半加器
,除开第一位是两个二进制相加外,第二位开始需要加上前一位的进位,所以,需要两个半加器和一个或门来组成全加器
,八个全加器就组成了一个八位的加法器,一个八位加法器用了144。 -
或门+与门+与非门组成异或门 异或门+与门组成半加器 两个半加器和或门组成全加器 八个异或门组成一个求补器(减法)
二进制减法器
-
在十进制中为了不借位,统一求减数对9的补数,然后得到的数与被减数相加,再加1,再减去1000,就得到了差。如果减数大于被减数,还是求减数对9的补数,然后与被减数相加,在这里不再+1,而是直接减去9。在二进制中是求1的补数,也叫做反码()。
计算机中的减法
你可能听说过,计算机中的算数都是用加法来替代的,减法也不例外,“减去一个数等于加上一个数的负数”,计算机中用补数来代表你相加的负数。假设我们不需要一个无线大或小的数,人为的给它一个有限区间,就可以表示成:
在二进制中也是如此,拿八位二进制为例子,范围为00000000~11111111,
对应十进制中的0~255,如果想表示负数:
2的补数同理:为1的补数+1,等价于1的反码+1,一个数的负数就是它对2的补数,-128比较特殊,所以只能是-128~127。所以,二进制的加法必须分清楚是有符号还是无符号的,一半如果两个操作数和结果的符号为不同,结果是无效的。
反馈与触发器
振荡器(时钟):
一个输入和输出相反的继电器,不在人为的干涉下,可以自发的工作。一个振荡器从一个初始状态再次回到这个状态的过程叫做一个循环,或者叫做一个周期,周期的倒数就是这个振荡器的频率(赫兹-Hz)。
反馈:左边的输出是右边的输入,右边的输出是左边的输入。
触发器(Flip_Flop):有两个稳定状态的电路。
锁存器:一个触发器+一个保持位(CLK)组成的电路可以根据保持为来暂存上一次输入的数值
一个锁存器包括一个反相器,两个与门,两个或非门 | ![]() |
![]() |
---|
加法器的进化
可以看到有了8位的锁存器,之前的加法器已经可以进行三位以上的运算了。
计数器
之前的触发器都为电平触发器,对于计数器来说,边沿触发器更有效,他是有两个电平触发器连接而成的,只有当保持位从0跳变到1时,数据才会保存下来。因为振荡器会经历从0-1-0-1的过程,这个过程是振荡器的频率(周期),所以触发器的变化周期是振荡器的一倍,所以触发器的频率是振荡器的二分之一,这个组合也叫做分频器。多个分频器接在一起就能组成一个记时器,循环一次的时间就可以用来计数。
![]() |
![]() |
![]() |
---|---|---|
边沿触发器 | 简化图 | 与振荡器相连的边沿触发器(分频器) |
存储器组织
-
之前的锁存器已经帮我们完成的加法器,和计数器,但它是同时将8位的数据存储,同时取出的,如果要分别存储呢?
-
-
通过控制三个地址端口就能实现2的3次方个,也就是8种可能,每多一个端口,就在这基础上翻倍,也就组成了所谓的RAM阵列:
上图就代表了有1024组,每组有8个比特的阵列。这就是读写存储器,也叫做随机访问存储器,又叫做主存,因为由继电器组成,断电就丧失磁性丢失数据,所以也叫做易失性存储器;
自动操作
- 之前的操作让我们可以实现简单的加法和减法了,但是如果要加十次,百次,千次呢?一次次的输入如果有一次输入错误就要冲头开始,所以,我们使用触发计数器+寄存器(RAM)+累加器(加法器和锁存器),由计数器来分配地址,寄存器来存储指令和数据(三个字节,一个字节存指令代码,两个存指令操作的数据地址),通过指令来操作数据和地址完成加减乘除的操作(本质都是加法)。
定点数和浮点数
-
数字有整数,分数,百分数等,整数又分为正整数和负整数(补数),分数又有有理数和无理数之分,以上又称为实数,负数的平方根是虚数,两者一起构成了复数。
-
我们已经知道在计算机中的整数用二进制怎么表示,小数用定点数和浮点数来表示
定点数:一个字节保存两个数字,多一个字节来保存点。
浮点数:浮点数遵循科学记数法,也就是有效位在1~10之间,又IEEE(电气与电子工程师协会Institute of Electrical and Electronics Engineers)制定,有单精度和双精度两种格式
发展史
计算机的发展从最开始的继电器->真空管->晶体管-->硅芯片,遵循摩尔定律,每18个月芯片上的晶体管就会翻一倍,通过总线(所谓总线,就是联通电脑上的各种电路板之间的通道,现在所熟知的PCIE就是Intel的总线)来给各个芯片之间发送信号(地址信号,数据输出信号,数据输入信号,控制信号)和供电。开始有了操作系统,从开始的ASCLL(127个字符)码到unicode码(65535,UTF-8,GBK都是根据unicode),到键盘,鼠标替代控制面板解码给解码译码器发送指令操作RAM,从内存(RAM,ROM)到磁盘,从低级语言到高级语言,再到面向对象语言(OOP),再到虚拟内存(把内存里暂时用不到的放到磁盘上做临时文件)再到有彩色显示器(分辨率*每个像素的字节数就是显存占用,颜色数=2的像素比特数的次方),声波转换成数值,各种压缩算法。最后到万维网。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用