计算机中有哪些令人拍案叫绝的设计?-云顶集团3118acm

计算机中有哪些令人拍案叫绝的设计?-云顶集团3118acm

来源:it之家
发布时间:2022-11-27 12:31
字体:

今天的文章从对八十年前使用的飞机的攻击开始。

计算机中有哪些令人拍案叫绝的设计?

那次偷袭早在2001年就拍过了——珍珠港,绝对是一部精彩的空战电影但是在看电影的过程中,你有没有想过这个问题:二战的时候,你自己的飞机发射的子弹不是在空战的时候打中了自己飞机的桨叶吗

机枪射击协调器:是一战时在盟军服役的荷兰人安东尼·福克发明的,他把凸轮安装在螺旋桨轴上,凸轮的三个突起刚好与叶片错开一个角度当突起接触到金属杆时,连接到金属杆后端的机枪发射器就会被激活,然后发射子弹相反,当刀刃和枪管形成一条直线时,机枪会自动停止射击这个别出心裁的设计完美避免了战斗机自残的事故

我当时知道它的原理后,反应是这样的:

卧槽,还有这种操作!

这么简单,我怎么没想到!

的确,令人震惊的发明往往看起来很简单,你常常会想,这么简单,嗯,我怎么没想到呢。

还是那句话,简单就是美,但是简单往往比复杂困难得多。

其实电脑设计也是一种艺术游戏我们今天要讲的题目是计算机补码的计算看似简单,但这个设计也很精致

首先,逻辑电路如何计算加法

1938年,香农在麻省理工学院发表了著名的硕士论文《继电器和开关电路的符号分析》,这是一篇划时代的论文在其中,他明确指出,电子工程师可以使用布尔代数的所有工具来设计开关电路也就是说,逻辑运算可以通过电路来实现然后人们根据这个理论设计了各种logicgate来进行数据运算后来的电子计算机的运行原理都是基于这个理论

当开关a闭合时,线圈产生磁力吸引开关m,接通灯泡的电路,灯泡就会亮这是最简单的逻辑电路你能想象人类发明的cpu甚至所有存储设备,其实都是由这一堆堆开关组成的吗虽然现代的cpu用的是晶体管,但是原理是一样的例如,苹果最新的m2芯片上集成了200亿个晶体管,相当于200亿个开关

就像我们老祖宗说的,一生二,二生三,三生万物。

后来人们根据上面的电路做了简单的改造,无非就是常开常闭开关,或者常闭常开开关等等,并发明了各种逻辑门,可以实现更多的逻辑电路,如与门,与非门,或门,或非门,异或门等

比如下面的与门连接一个开关a和b,灯泡必须同时关断才能打开:

人们没想到这种电路会和二进制加法有某种联系比如二进制1 1=10进位是1,这个与门双开关必须同时闭合才能导通如果closed代表1,open代表2,那么逻辑关系就是1,1 = 1

有一天,人们惊奇地发现一个与与门并联的异或门可以做二进制位的简单加法,并把它命名为半加法器之所以叫半加器,是因为它没有办法把进位输出包含在下一位运算中,比如1 1=10,等号右边的进位暂时不能包含在下一位运算中

让我们把这堆符号合成一个整体:

半加器

后来,人们改进了这种电路,用两个半加法器加上一个或门构成一个全加器这一次,它是强大的

让我们把上面那堆符号合成一个整体:

全加器

多个全加器的组合可以计算多位二进制加法,下面的加法器可以计算四位二进制加法:

通过这组加法器的组合,我们可以计算出5 3=8的小数运算很难想象这个操作居然是由几个开关实现的!其实这就是现代计算机加法计算的原理

在这里,你有没有惊呼:

卧槽,还有这种操作!

这么简单,我怎么没想到!

但是不要太早惊喜,后面还有更多惊喜给你。

到目前为止,我们已经可以用自己设计的逻辑电路来计算加法,但是还有一个重要的问题:减法怎么算因为计算减法涉及到借位的繁琐操作,而我们上面设计的电路只能进位,那么我们是否要为减法设计一个特定的逻辑电路呢答案肯定是否定的,那么我们的电路就会非常复杂我们考虑的是如何通过现有的逻辑电路计算减法,也就是如何做加法

这个问题特别有意思有人会说减去一个数等于加上该数的负数,比如公式5—3=2但问题是,这样的说法其实是在计算减法,按照我们现在设计的开关电路是无法实现的那么我们该怎么办呢

这个公式让我们计算起来很不舒服首先从个位数来说,3小于7,所以我们要从小数位数开始进位,但是从小数位数借位后,还是小于4,还要从百位数借位

我们实际上得到了我们想要的答案,并且没有使用借用。

其实计算结果是一样的,避免了借用操作。

此时,你可能会疑惑:但是这个公式也是用减法的,而且是两次计算机在计算时还有跳过这种减法的技巧吗

在这里,神奇的事情发生了因为计算机用的是二进制,所以从一串1数中减去第一个减法,也就是补数与十进制不同,前者根本不需要做减法,而是可以把原来的二进制数1改成0,0也可以改成1这个逆数可以叫做逆码,可以通过逻辑电路中的反相器来实现,第二次减法是在二

我们来看看使用二进制计算的过程有多奇妙。

第一步,补充操作:

步骤2,将结果加到被减数213:

第三步,在第二步的结果上加1:

第四步是将第三步结果的最高位取反,相当于减去256:

就这样,我们终于得到了想要的结果:66虽然全程用了两次减法,但在二进制看来,根本不用减法

二,为什么要用补码存储整数。

可是,上述电路仍有局限性它只能计算被减数大于被减数的运算,不能表示负数我们想要的是利用现有的电路,使它能够计算加法,减法和负数换句话说,让所有运算都按照加法实现如何实现这一点

这时候补码运算就登场了。

首先,为了区分整数和负数,计算机指定了符号位最高位指定为符号位,0代表正数,1代表负数,其余为数字位

整数—1表示如下,只是符号位改为1:

但这是有代价的,意味着我们数据位的表示实际上少了一位,导致我们本来可以表示的数没有那么大例如,单个字节原本可以表示0到255之间的数字,但由于符号位占用了一位,实际上我们表示数据的位数变成了7,最大只能表示127

这时我们引入补码和补码的概念:正数的补码是它们的原码,而复数的补码是特殊的,符号位不变,数据位的反转是补码,补码加1是补码:

计算机内部的所有运算都是以补码的形式进行的,为什么呢。

先来看看吧。如果以原代码形式计算,假设要计算1—3,实际上是1 :

结果是1 = —4,明显不正确。

那么如果我们用逆代码来计算会怎么样呢。

这个结果是正确的,正如我们所料,但如果我们计算3—1呢。再试一次:

最后得到3 =1的结果,说明用逆码运算把小数从大数中减去是没有问题的,但是把大数减出来的结果就有问题了直觉告诉我们结果是1

随后,人们想出了补码的神奇操作。让我们来看看它的结果:

这次计算的结果和我们预料的一样正确。

还是那句话,为什么补码运算是正确的。我们来仔细分析一下:

当从一个大数中减去一个小数时,结果一定是正数但是,在我们使用逆代码运算之前,结果总是少一个如果用补码来计算,负数将从反码加1到补码计算出结果后,因为正数的补码和反码是一样的,所以不需要减去,所以只是相当于结果加1

当一个大数减去一个小数时,结果一定是负数如果采用补码运算,负数将由补码加1转换成补码,反之结果为负,负数由补码减1转换成原码,只是偏移,结果不受影响精彩,无以言表

补码的发明彻底简化了我们的硬件电路,不用为减法设计额外的电路,只需要加法电路就可以计算减法太神奇了

看到这里,你有没有惊呼前两句:

卧槽,还有这种操作!

这么简单,我怎么没想到!

13.7k
ad555
- 广告服务 - 加入云顶集团3118acm - 不良信息举报-
市场情报网 云顶集团3118acm的版权所有
备案号:
网站地图