電腦是如何知道1+1=2的?
編程最基本的就是數學演算法,比如你定義a,b=1,那麼a+b的值編程語言會給你算出來等於2,這些語言我理解的最底層的還是調用了操作系統的演算法,那麼操作系統是如何知道1+1=2的呢?
是用 CPU 中的邏輯門電路實現的。
一位半加器。
一位全加器。
而邏輯門則是用 MOS 管實現的。
CMOS 實現的 NAND 門。
NAND 門的物理布局。題主要是還不滿意的話,我可以幫你從 MOSFET 原理,到半導體材料,到固體化學、晶體學,到量子力學慢慢科普。
// 操作系統「告訴」CPU進行加法操作,然後CPU進行加法運算,將得到的值再告訴操作系統。
具體一點是這個樣子的...
你現在寫了一個C語言程序(jiafa.c),單擊保存,這個東西就被保存在你的硬碟里了。
int b = 1 + 1;編譯以後這個程序就變成了CPU能夠讀懂的東東(機器指令和數據).比如如下
1 ADD 1 MOVE TO b然後,你手賤(:--),雙擊打開它。那麼這段程序就從硬碟跑到了內存里。於是你的內存里出現了如上圖所示的 指令與數據(1 ADD 1 ...)
於是那個晝夜不停工作的CPU,會讀到這段代碼。然後把它運行出來,按照指令把算得的2放到內存里指定的位置。於是乎,你得到了2.
操作系統,在這裡起到的角色就是,將你的操作(保存文件,輸入數字等等)和程序(b=1+1這種高級語言)翻譯成CPU能夠理解的東西。說白了就是一個翻譯官。
CPU如何將1+1算成2?
(1表示成二進位就是 01, 2在二進位中是10.)在具體的CPU電路中,它們是這麼工作的.
程序和數據就是一串01010001, 然後並排地連接到CPU的八個口上。指令(ADD)也是0和1組成的,假設1代表有電,那麼0100這個指令就相當於只打開了加法器的開關,然後加法器會把(01), (01)這兩個數字加起來,並且在另一端輸出(10)。
這樣一條條指令就會被CPU執行,並且將數據放進內存里。(當然CPU裡面可不只是加減乘除運算器,還有一些器件能將數據搬運到內存或硬碟之中)
什麼樣的電路能使得01 與 01的輸入獲得10?
看來以上的說明,大家應該能明白,CPU就是一堆運算器的電路的集合。這些電路會在相應的代碼下通電並工作。但是,什麼樣的電路能讓 0, 1 和 0, 1的輸入變成了 1, 0?其實 01 + 01 = 10還可以分解成為兩個部分.
1. 一位二進位的加法運算
一位二進位加法即 0 + 0 = 0, 0 + 1 = 1 , 1 + 0 = 1, 1 + 1 = 0(加1位進位)如何在電路裡面實現這玩意? 用「三極體」就好了(正巧有三根管)!正因為三極體擁有著特殊的電路特性,使得我們能用它進行組合實現任意一種 0 1 之間的邏輯關係運算。
為什麼三極體擁有能讓有電(1)和無電(0)信號產生二進位的邏輯關係?
[1. 什麼是二進位的邏輯關係(與、或、非...)? 2. 如何用三極體構建輸入與輸出信號之間的關係邏輯? ... (這兩個問題內容太多,先省略...)]假設我們擁有了最基本的0,1邏輯, 我們就能用它來組合,疊加,進行更為複雜的邏輯運算。
如果想了解如何用「0,1邏輯運算」去實現各種各樣的運算和更複雜的邏輯,請參考《數字邏輯設計》(Digital Logic Circuit Analysis Design, by N. P. Nelson).這本書..
2. 進位的保存電路
一位數的加法如1+1的時候,會出現1位進位。如何存儲這個信息,並將其疊加在下一位加法運算中呢? 利用上面的知識,我們只要再加一個三極體,讓它只在1和1的情況下輸出1,其他情況都輸出0就可以了。 於是我們只需要兩個元件就可以完成這件事情。(以下無恥的盜圖) 這個圖就是一個抽象的加法器表示。。。這裡用了兩個三極體,分別負責一位數的加法邏輯和進位的保存。下方的三極體(連接著c那個), 就用來保存進位,而上方的三極體(連接著s的),就是用來實現一位二進位加法的.最後,我們再將很多很多個三極體串連,並聯再加點電阻什麼的,就能得到一個挺高級的加法器,能進行多位數字的加法...
於是我們過上了幸福的生活..首先,ALU(邏輯運算單元)中的所有計算都是通過邏輯電路完成的。一下是一些常見的邏輯門,就不解釋了。不明白的同學可以先去看另一個回答:CPU是怎麼實現運算的 ? - 胖胖的回答
根據圖靈機模擬人類計算時大腦的工作狀態的模型,人類計算加法也可以抽象成一個機械化的過程。考慮5+7=12這個加法。5加7的結果是2,然後心中默記產生的一個進位。最終寫成12。 5
+ 7
-----
12
換成二進位,是一個道理,
0000 0101
+ 0000 0111
-------------
0000 1100
其中每一位的加法還是能分解成兩個動作:
- 同一位的兩個數字相加
- 如果當前位結果大於1,則向前進一位
第一個動作可能的結果(真值表)有:
0 XOR 0=0
1 XOR 0=10 XOR 1=1
1 XOR 1=0
這個真值表和一個簡單的「異或門」是一致的。
第二步進位,只有1+1才需要進位1,所以真值表如下:0 AND 0=0
1 AND 0=00 AND 1=01 AND 1=1
這和「與門」的真值表是一致的。
所以把一個「異或門」和一個「與門」組合到一起,就構成了一個「一位半加器」:
但事實上一位半加器只適用於末位數的加法。高位的二進位加法需要考慮3個輸入,就是還需要額外考慮上一位得到的進位。這個過程可以用兩個半加器來完成。兩個半加器組合起來,構成一個完整的「一位全加器」。把8個這樣的一位全加器組合起來,就構成了一個「八位全加器」:
從最末尾開始相加,剛才的5+7:
0000 0101 + 0000 0111
反過來就變成:
1010 0000
+ 1110 0000
-------------
0011 0000
把最初的進位c_in設為0,得到的結果反過來就是:0000 1100 = 12。
加法規則寫死在CPU里了
看過一本書,《計算機的心智——操作系統的哲學原理》。
書里提到了一個概念:計算機科學,是一門人造學科。人造學科里沒有絕對的對與錯,只有好與不好……(再說就偏題了)
所以,是人們希望用計算機運算,然後根據高電平低電平,規定了二進位在電路里的表示規則。再然後設計了一個符合這種表示規則,並且在輸入兩個1時,可以輸出一個值為10的二進位的電路。再然後規定這個電路做的是加法。然後再設計另一個電路,輸入x和y,輸出z,並且在數學上x-y=z,於是規定這種電路做的是減法。再規定出乘法、除法。。。。再然後用很多個這樣的電路一點點組合、設計、開發,假以時日,最終成了計算機。電腦並不知道1+1=2。電腦跟小孩子一樣,只知道,每當他收到一粒糖、再收到一粒糖,他就要回復一個笑臉,這就叫做程序。
至於這粒糖是5伏電壓還是12伏電壓,那是你們人類自己去設定的事。而把糖叫做1,把電腦回復的笑臉叫做2,那也是你們人類自己的事。不是調用了操作系統的演算法,操作系統會提供一些功能,但不包括類似加法這樣的基礎操作,可想而知,如果連加法都要再通過操作系統,這效率會有多低。所以,這是直接走的彙編指令,也就是其他同學回答的機器指令,再往下討論機器指令是如何實現1+1的,那就是數字電路,超大規模電路cpu的加法指令。在這個層次上實現這些計算就是電路了,具體來說就有許多邏輯電路的東西,各種門,就是寫死在電路上了。看來你對計算機體系結構還不了解,還需要花更多時間去學,如果感興趣的話。百度,加法器,alu,但願我沒記錯。
我正在進行一個視頻的翻譯,大概會分為4個部分上傳,這個系列的視頻就是專門回答這個問題的,其中第3部分「半加器、全加器及進位線(項)的實現」是重點,看視頻應該比看圖片更容易理解。
以下為此視頻的第一部分,即在計算機中1和2是如何表示的,以及1與2是如何與邏輯門的狀態建立映射關係的。
計算機是如何實現1+1=2的(第一部分)-百家號第2部分,主要講解的0和1二進位計數系統與可測狀態映射關係的建立。
計算機是如何實現1+1=2的(第二部分)__0和1二進位計數系統與可測狀態映射關係的建立-百家號第3部分,主要講解半加器及全加器和進位線(項)的實現。可以把1+1 =2視作一個系統,這個系統可以如下表示 S = {1,2 ,+ ,=},想解決1+1= 2這個問題,首先要想明白,1+1 =2是一個純數學問題,是高度抽象的。想要藉助有形的工具(此處是「電腦」)解決它,首先要在抽象系統與實際系統之間建立一個映射。常見的數學中的「轉化思想」,把無形抽象的問題轉換為有形可測量的問題。其中的元素「1」既可對映射於第一個燈泡的點亮狀態,也可映射於晶體管的導通狀態;其中的元素「2」映射於第2個燈泡的點亮狀態,也可映射於從右向左數第二個晶體管的導通狀態。不同位置的燈泡狀態對應於不同的權值。接下來,就是要建立數學系統中"+"與"="在現實生活中的映射了,另外多說一點,映射的狀態機的狀態必須是可測量的,這是傳統計算機的模型;並非所有狀態機狀態值都是可測量的,像薛定諤的貓中貓的狀態就是不可測量的,這種量子的不可測量狀態被用於量子計算機中。
總結一句就是:要想通過實體(此處為電腦)去解決抽象問題(此處為 1+1=2),必須建立好高效的、簡捷的映射。
計算機是如何實現1+1=2的(第三部分)__半加器及全加器和進位線(項)的實現-百家號計算機是如何實現1+1=2的(第四部分)-百家號最後,歡迎大家關注我的百家號「晴耕雨讀」,和知乎專欄「硅之美」硅之美 - 知乎專欄
不出意外的話,我應該在明天或後來完成視頻全部翻譯,相信大家看過此視頻,對於此問題的理解,可以達到八九不離十的程度。另外,有不明白的地方,可以在下方留言,我可以進行一一的解答。
其實你需要的不是數字電路基礎,而是計算機組成原理…
一個燈泡用線接電池,中間串聯兩個開關,那麼只有兩個開關都打開了,燈泡才亮。這就是「並」邏輯電路了。如果把兩個開關的解釋為+1的話,得出2的結果就是由電路的結構而決定的。所以理論上用水這樣有可預期物理「動作」的物質也可以做出邏輯電路,但是效率不夠高。
相似的,生活中有的樓梯間里的燈泡可以在樓上和樓下分別控制,就是所謂的單刀雙擲開關了,中學都學過的,這個就是「或」邏輯電路了。
其實計算機就是基於邏輯電路這麼簡單的原理,只不過邏輯電路數量及其巨大而已。
都解釋的好麻煩,竟然還有畫電路圖的!首先,操作系統其實不知道1+1=2,因為他沒這個功能,這也不是他該乾的活。第二,計算機裡面的運算都是二進位的運算,也就是說:1+1=2其實在電腦裡面是(N個0)1+(N個0)1=(N-2個0)10。N的個數取決於你的CPU...然後再看下計算機是怎麼做加法的我們都知道,兩個一位二進位數相加,最多能得到一個二位的二進位數。OK 也就是說,A+B=CD,ABCD分別表示不同的二進位數。是不是有點像小學的數學題?當然,計算機沒有這個智商來寫這個題,考慮到AB也就4種組合,我們把4種組合的結果直接告訴電腦不就行了。我們畫個表
其實這個就是 @vczh 說的加法規則。
然後我們會發現,C,D與AB似乎有點關係。如果會邏輯運算,我們可以輕易地發現我們看著估計胃疼,但是CPU在邏輯電路的幫助下卻是做這個的好手。邏輯電路參考@Belleve
畫的加法器。如果你滿足於1+1=2 那麼下面的就沒你事了,如果你想知道2+2=4 那麼繼續我們剛剛討論的是一位加法運算,這個是計算機計算的基礎,但是並不是每次計算都是恰好讓你成功的A+B=CD,其實經常有意外發生。我們來個大家熟悉的圖這個以為就是低位發生了進位。地位發生進位的時候 加法就成了A+B+Ci=CD,我們再看一下表格
一樣的道理,只不過是邏輯運算的方式變一下
D=A⊕B⊕CiC=A·B+Ci(A⊕B)
對於CPU來說,這樣的運算也沒有什麼壓力直接按照上面那個全加器來就行了。當然,這都是一位的運算,不過CPU在計算多位時直接拆開就行。目前的電腦是不知道1+1=2的,它只是1+1 = 2的搬運工
從提問看你是完全的外行,一兩句話很難跟你說清楚,推薦你兩本科普書吧,《編碼的奧秘》和《穿越計算機的迷霧》,看了應該會明白
0001+0001 = 0010
1+1=0(cf=1)
你需要精通《數字電路基礎》~_~
數字電路這門課會給你答案
電腦也不知道,操作系統也不知道。是通過電路把兩個高點平(1)的輸入轉換成一個高電平和一個低電平(0)的輸出,就是1+1=10了。看了數字邏輯和計算機組成原理自然就懂了
這些語言我理解的最底層的還是調用了操作系統的演算法
不是這樣的。不是所有的操作都會讓操作系統代為執行。
用戶程序運行的時候,操作系統會將 CPU「讓給」程序。加法操作內置在 CPU 裡面,程序直接調用 CPU 的加法操作就行了。操作系統是如何知道1+1=2的呢
現在問題就變成了 CPU 是如何知道 1+1=2 的,請參考 @Belleve 的回答。
數字電路技術基礎。你就懂了
電腦根本不懂1+1=2從最簡單的來說,不看計算機編程語言等等太複雜,從硬體電路或者計算器的角度會更容易理解。可以理解為電腦並不明白這個式子的任何一點意義,包括什麼是1,什麼是加等等,當你在計算器上按出1+1的時候,其實更相當於你搭建了一個軌道,可以讓一個小球滾動到某一個指定的洞內,當你按下等號的時候,相當於讓這個小球從起點開始滾動,它恰好每次都滾到同一個洞中,而這個洞,被我們命名顯示2,也就是說,每次有小球滾進來時候,我們就說顯示了2…類似的1+2就相當於這個軌道偏了一點兒,恰好每次都滾到另一個洞中,於是類似的而這洞有球,我們就說顯示了3
因為cpu里有大量的加法器~至於這是啥你可以百度下電路圖,總而言之,功能就是吧輸入輸出的高低電平抽象成0和1,確定輸入和輸出後。比如輸入高低,輸出高,輸入高高輸出低。輸入輸出的關係其實是可以枚舉的,就高高,低低,高低,低高,所以電路當然也肯定是可以確定的。
但是只有高和低還表示不了2這個東西吧。
所以我們的加法器對1+1的輸出也並不是2而是10也就是二進位的2。10是兩位,所以其實我們加法器的輸出也是兩個埠。高高電平輸入,這時候再額外輸出一個高表示進位。
再複雜的加法運算其實用幾個加法器就可以解決啦~樓主找本數字邏輯電路的教材,找找加法器來看一看吧~還是挺有趣的計算機只懂得0和1,1加1,前一個1代表真,後一個1代表真,1+1=10(bin)
推薦閱讀:
※互聯網行業哪個職位比較有前途?
※IT達人都是自己組電腦嗎?大家自己都用什麼樣配置的
※IBM有哪些黑科技?
※補辦新的身份證後為什麼不能使舊身份證作廢?身份證丟失後可能帶來什麼不良後果?