如何通俗的解释计算机是如何实现1+1=2计算的?

论坛 期权论坛     
匿名小用户   2019-10-20 22:56   3499   0
<div>作者:hczhcz<br>
链接:http://www.zhihu.com/question/29707696/answer/45469968<br>
来源:知乎<br>
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。<br><br><div class="zm-item-answer zm-item-expanded focusin navigable-focusin">
<div class="zm-item-rich-text js-collapse-body">
<div class="zm-editable-content clearfix">首先,你在键盘上依次按下了1+1&lt;enter&gt;。<br><br>
键盘上的电路触点被接通。键盘主控芯片此时在不停地、依次地检测各个触点两端是否导通,于是它发现了按键。按照预先烧录的程序,它在向USB线上发送的电信号中写入一个数字,告诉线另一头的庞然大物:“有键被按下了!”<br><br>
信号内容——左边的ctrl没按 左边的shift没按 左边的alt没按 左边的win没按 右边的ctrl没按 右边的shift没按 右边的alt没按 右边的win没按,啦啦啦啦啦啦啦啦,按了“1”键,别的没按,别的没按,别的没按,别的没按,别的没按。<br><br>
USB线的另一头连着电脑。电脑上的USB控制器读到了信号,把它转交给CPU(对,就是灯等灯等灯生产的那个)。CPU暂时停下了手上的工作,运行了操作系统中的一小段程序,把按键记录了下来。<br><br>
CPU的动作很快,它总是马不停蹄地忙活各种不同的事。终于,它开始处理这个按键了。CPU上运行着操作系统,操作系统看到你按了键,于是找到了你正在操作的计算器程序。按照事先的约定,操作系统告诉CPU,“你去关心下计算器吧,它处理按键的程序在这里”。<br><br>
于是,计算器中的一段程序开始运行。它读出按键“1”,记了下来。它告诉图形库,“给我在屏幕上显示1”。<br><br>
图形库照着做了,它通知操作系统“在计算器的窗口上用这个字体、这个字号画上1”。操作系统找到了负责绘图的GUI(不是“鬼”)模块,一个点一个点地把“1”画了出来:<br><br>
白黑白<br>
黑黑白<br>
白黑白<br>
白黑白<br>
白黑白<br>
黑黑黑<br><br>
就这样,屏幕上依次显示出了“1+1”。<br><br>
当计算器读到回车的时候,它知道自己摊上大事了。<br><br>
计算器想起自己读过1,加号,还有另一个1。它想,加号是个低优先级的二元运算符(就是两块钱做一次的运算符(误)),那么它两边的1就应该是用来加的两个数了。它分析道,“这是要做一个加法的节奏啊”。<br><br>
于是,它把之前拿到的左边的1和右边的1取了出来,然后告诉CPU——<br><br>
你快给我算出来:加法,这个数(左边的1),那个数(右边的1)。<br><br>
在程序猴子们的视角下,这是一条长这样的指令:add %rcx, %rdx。在电脑的视角下,这是一条长这样的指令:010010000000000111001010。<br><br>
CPU看到这条指令,很快明白了要做的事,把之前计算器获得的两个数000...01和000...01放到了用于计算的电路上。数字在电路上走着走着,来到了一段叫ALU的电路里。首先,末尾的两个小1经过了几道门,它们变成了小1(进位)和小0(当前位),然后进位的小1又和倒数第二位的两个小0擦出了激情的火花,变成了小0(进位)和小1(当前位)……<br><br>
啊,这样写下去节bian4奏cheng2不xiao3太huang2对wen2了呀。<br><br><blockquote>这里描述的是一个朴素的加法器——用逻辑门(二进制位运算)逐个算出进位,依次计算每一位的结果。<br><br>
但这样的效率是很低的,因为高位的计算要等低位的进位算出来之后才能继续。事实上,现代的CPU里普遍会使用进位预测器。<br><br>
一个常规的进位预测器通常是依次将进位信息从低位向高位推1,2,4,8……位。下面是用软件实现的Kogge-Stone加法器:<br><br><div class="highlight">
<pre class="blockcode"><code class="language-python"><span class="c"># input a, b</span>

<span class="n">g</span> <span class="o">=</span> <span class="n">a</span> <span class="o">&amp;</span> <span class="n">b</span>
<span class="n">p</span> <span class="o">=</span> <span class="n">a</span> <span class="o">^</span> <span class="n">b</span>
<span class="n">g</span> <span class="o">=</span> <span class="n">p</span> <span class="o">&amp;</span> <span class="p">(</span><span class="n">g</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span><span class="p">)</span> <span class="o">|</span> <span class="n">g</span>
<span class="n">p</span> <span class="o">=</span> <span class="n">p</span> <span class="o">&amp;</span> <span class="p">(</span><span class="n">p</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span> <span class="o">|</span> <span class="mb">0b1</span><span class="p">)</span>
<span class="n">g</span> <span class="o">=</span> <span class="n">p</span> <span class="o">&amp;</span> <span class="p">(</span><span class="n">g</span> <span class="o">&lt;&lt;</span> <span class="mi">2</span><span class="p">)</span> <span class="o">|</span> <span class="n">g</span>
<spa
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:50
帖子:1079
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP