新闻中心
你的位置:云平台appkaiyun > 新闻中心 >

kaiyun官方网站 计算机中有哪些令东谈主拍桌惊羡的想象?

发布日期:2024-01-09 06:07    点击次数:134

《珍珠港》,完全是一部精彩的空战电影。然则在不雅影的流程中,你有莫得想过这个问题:二战时期的飞机,在进行空战流程中我方飞机射出的枪弹难谈不会击中我方飞机的桨叶吗?其实我小时间看这部电影就有这样的疑问,直到其后我在大学学习了《机械旨趣》后,解其背后的旨趣后:

机枪射击合营器:它是一战中在友军中投军的荷兰东谈主安东尼·福克发明的,他把凸轮安装在螺旋桨轴上头,凸轮的三个了得与桨叶刚好错开一个角度,当突起部分遭受金属棒后,金属棒后端辘集的机枪辐射安装就会被激活,继而完成枪弹辐射,反之,当桨叶与枪管造成一条直线时,机枪自动住手射击。这个神秘的想象完满地灭绝了搏斗机出现自残的事故。

那时我知谈它的旨趣后,响应是这样的:

卧槽,还有这种操作!

卧槽,这样肤浅我若何没意象!

真实,让东谈主虎躯一震的发明时常看上去王人终点肤浅,况且你正常会想,这样肤浅,嗯,我若何没意象?

我照旧那句话,肤浅即是好意思,然则肤浅时常比复杂贫穷得多。

其实计算机的想象亦然一门艺术的博弈,我们今天聊的话题即是计算机补码的运算,它看似肤浅,然则这个想象亦然精妙绝伦。

一,逻辑电路是如何计算加法的

1938年,香农(这个东谈主不必说了吧,计算机行业的东谈主没东谈主没听过他吧)在麻省理工学院发表了那篇题为《继电器和开关电路的符号分析》(A Symbolic Analysis of Relay and Switching Circuits)的著明硕士论文,这是一篇具有划期间意旨的论文,他在文中了了地施展:电子工程师不错期骗布尔代数的扫数器具去想象开关电路。也即是说逻辑运算尽然不错用电路来进行收场,随后东谈主们笔据这一表面想象出了各式逻辑门(Logic Gate)来进行数据运算,后期的电子计算机的运算旨趣王人是基于这一表面进行收场的,比如东谈主们笔据继电器或者晶体管的特质,想象了异或门(对于异或运算的实质请参考 如何粗拙意会异或运算 ):

当开关 A 闭合,线圈产生磁性将开关 M 吸合,接通灯泡的回路,灯泡就会亮,这是一个最肤浅的逻辑回路。你能想象东谈主类发明CPU致使扫数的存储莳植其实即是这一堆堆开关组合成的吗,天然当代CPU用的是晶体管(速率更快、体积更小),然则旨趣王人是雷同的。比如苹果最新发布的M2芯片上头集成了200亿个晶体管,翻译成东谈主话即是上头放了200亿个开关。

这就像我们老祖先说的那句话,一世二,二生三,三生万物。

其后东谈主们笔据上头阿谁电路进行肤浅矫正,无非即是开关的常开变常闭,或者常闭变常开等等,发明出了各式不同的逻辑门,不错收场更多的逻辑回路,比如与门(AND)、与非门(NAND)、或门(OR)、或非门(NOR)、异或门(XOR)等等。

比如底下这个与门即是连个开关A与B必须同期闭合灯泡才气亮:

这样的电路东谈主们没意象尽然会与二进制的加法存在着某些相干,比如二进制1+1=10的进位是1,而这个与门电路双开关必须同期闭合才会亮,淌若闭合代表1,断开代表2,那么逻辑关系即是1 AND 1 = 1.

有一天,东谈主们惊奇地发现,一个异或门并联一个门尽然能作念肤浅的二进制位的加法运算,给它定名叫半加器。之是以叫半加器,是因为它还莫得宗旨将进位的输出纳入下一位的运算,比如 1+1=10,等号右边的进位暂时还不成纳入下一位的运算。

我们把这一堆符号合成一个合座:

半加器

其后,东谈主们创新了这个电路,用两个半加器再加一个或门,构成一个全加器,此次就横暴了,全加器弥补了半加器不成计算让进位参与运算的污点,不错将前一位的进位纳入本位进行一块计算,是以全加器输入端有三个输入:

我们把上头这一堆符号合成一个合座:

全加器

多个全加器组合在一块就能计算多位的二进制加法,底下这组加法器就能计算四位二进制的加法:

通过这组加法器的组合,我们就能计算十进制的 5+3=8 运算,很难想象,这样的运算尽然是我们通过几个开关收场的!实验上这恰是当代计算机进行加法计算的旨趣。

这里,你有没惊呼:

卧槽,还有这种操作!

卧槽,这样肤浅我若何没意象!

不外先别讶异的太早,后头还有更让你讶异的。

到这里,我们还是大略通过我们想象的逻辑电路来计算加法了,然则还有个紧迫的问题:减法如何计算呢?因为计算减法触及到借位这种繁琐的操作,而上头我们想象的电路只可进位,难谈我们还要为减法想象特定的逻辑电路吗,谜底细目是抵赖的,那样我们的电路就会终点复杂,我们接头的是如何通过现存的逻辑电路,也即是如何通过加法来计算减法呢?

这个问题出奇挑升念念,有东谈主会说了,减去一个数等于加上这个数的负数,比如 5-3=2 这个式子,可问题是这样的说法实验上照旧在计算减法,按照我们现在想象的开关电路是收场不了的,那若何办呢?

想象一下,我们上小学的时间,刚驱动学习三位数的减法的时间,我们王人不心爱一些带有借位的减法,比如 这个算式让我们计算起来很不兴隆,最初从个位,3小于7,是以要从十位进位, 而十位数借位后还小于4,还要从百位借位。

我们这里用一个技艺,先用 999 减去减数 147,显明这个算式不会产生借位:这个 852 我们称为9的补数,用这个着力与被减数213相加 临了将着力加1,然后再减去1000: 尽然取得了我们想要的谜底,况且没用到借位。

为什么这个迤逦的运算会正确呢?这是因为的题目不错化成底下的运算: 看到了吧,实验上是加了1000临了又给减去了,我们再把上式组合一下: 其实计算着力是雷同的,况且幸免了借位的运算。

到这里,你可能会有猜疑:可这个式子还用到了减法啊,况且是两次,难谈计算机在计算的时间还会有技艺跳过这个减法吗?

在这里,神奇的事情发生了,由于计算机汲取的是二进制,第一个减法也即是求补数是从一串1的数字中减去的,而二进制求补的运算不像十进制那样,前者根柢不需要作念减法,而是将原来二进制中的数字1变为0, 0变为1即可(这与径直计算减法着力是雷同的,然则这个技艺对计算机来说就省下了作念减法的运算),这个求相背数我们不错称为反码,不错通过逻辑电路中的反向器来收场,第二个减法在二进制中减的是最高位,而这个对计算机来说我们只需要通过一个逻辑门电路来截止最高位输出即可收场。

底下我们来看一下使用二进制计算这一流程有多奇妙

第一步,求补运算:

第二步,将着力加上被减数 213:

第三步,将第二步的着力加 1:

第四步,将第三步的着力最高位取反,相配于减去了256:

这样就最终得出了我们想要的着力:66,通盘流程天然汲取了两次减法,然则在二进制看来,根柢莫得使用减法。

二,为什么汲取补码来存储整数

然则,上头这个电路还有局限性,它只可计算被减数大于减数的运算,况且不成默示负数,我们想要的着力是使用现存的电路,让它大略计算加法、减法、还有负数,换句话说,让扫数的运算王人按照加法来收场,该如何收场呢?

这时间,补码运算就登场了。

最初,计算机为了分辩整数与负数,轨则了符号位,轨则最高位为「符号位」,0代表正数,1代表负数,剩下的才是「数字位」。举例对于两个字节 short 类型数字 1 在计算机里面是这样默示的:

而整数 -1 的默示步履是这样的,只是符号位变为了 1:

但这样作念是有代价的,意味着我们数据位的默示实验上是少了一位,导致我们蓝本能默示的数字没那么大了。举例单字节蓝本能默示 0 ~ 255 之间的数字,然则因为符号位占据了 1 位,实验我们默示数据的位数变为了 7 位,最大只可默示 127.

这时间,我们引出反码还有补码这个见识:正数的反码补码王人是其原码,而复数的反码相比特殊,符号位不变,数据位取反即是反码,反码加 1 即是补码:

计算机里面扫数的运算王人汲取补码的形态,那么为什么要这样呢?

我们先来看淌若汲取原码的形态进行计算,假定我们要计算 1 - 3,实验上即是1+(-3):

这样得出的着力竟然是 1 + (-3) = -4,着力显明是不正确的

那么淌若我们汲取反码进行计算,会怎么呢?

这样得出的着力即是正确的,与我们预期的雷同,然则淌若我们计算 3-1 会若何样呢,再试试:

临了尽然得出 3+(-1)=1 的着力,这阐发汲取反码运算,少许减大数没问题,然则大数减少许着力就出了问题,直观告诉我们,着力差了1.

随后,东谈主们想出了补码这种神奇般的操作,我们看一下它的着力是怎么的:

这样计算的着力就与我们期待的雷同,是正确的。

再细品一下,为什么补码运算会正确呢,我们仔细分析一下:

当大数减去少许的时间,着力一定是正数。而之前我们汲取的反码运算,着力老是少了1,淌若汲取补码来计算的话,负数从反码转为补码要加上1,在计算出着力后,因为正数的补码与反码调换,是以不必再减去,是以刚好相配于把着力加了1. 妙,不可言;

当少许减去大数的时间,着力一定是负数。淌若汲取补码运算,负数从反码转机为补码要加上1,而正值,着力是负数,这个负数从补码转为原码又要减去1, 刚好对消,着力不受影响。妙,不可言。

补码的发明,透彻简化了我们的硬件电路,不必为减法想象格外的电路,让我们只是通过加法电路就能计算减法,真实太神奇了。

看到这里,你有莫得惊呼开始那两句话:

卧槽,还有这种操作!

卧槽,这样肤浅我若何没意象!








    Powered by 云平台appkaiyun @2013-2022 RSS地图 HTML地图