計算機如何存儲和表示數字: 二進制。測試
MB
, GB
, TB
等。ASCII
,用來表示字符。UNICODE
1992年誕生,是字符編碼標準,解決ASCII
不夠表達全部語言的問題。二進制中,一個1
或0
叫 一位
(a bit).
8位能表示的最小數字是0, 8位都是0;最大數是255,8位都是1.
能表示256個不一樣的值,2的8次方.編碼
8位是如此常見,以致於有專門的名字:字節.spa
1 字節 = 8 位(1 bytes = 8 bits)操作系統
MB(Mege是百萬字節)
, GB(Giga是十億字節)
, TB(8萬億個1和0)
等,不一樣前綴表明不一樣數量級。設計
1千字節 = 2的10次方 = 1024字節
1000也是千字節(KB)的正確單位,也就是1000
和1024
都是正確單位。code
32位/64位計算機: 是一塊塊處理數據,每塊是32位或64位。視頻
32位能表示的最大數是:43億左右。(32個1)。遊戲
如今圖片都是用32位顏色
。圖片
正數,負數,整數,浮點數的表示
負數,大部分計算機用第一位表示正負:1是負,0是正。用剩下的31位來表示數字。能表示的數字範圍是:正 20億 到 負 20億ip
64位能表示最大數是正負9.2 * 10 ^ 18
計算機必須給內存中每個位置,作一個「標記」,這個標記叫「位址(ADDRESSES)」,目的是爲了方便存取數據。
非整數,常見浮點數。有不少種表示,最多見的是 IEEE 754標準。它用相似科學記數法的方法,來存取十進制值。例如: 625.9 = 0.6259 * 10 ^ 3
, .6259
叫「有效位數」, 3
是「指數」。
在32位浮點數中,第1位表示數字的正負,接下里8位存指數,剩下32位存有效位數。
ASCII
與其用特殊方式來表示字母,計算機能夠用數字表示字母,最直接的方法是給字母編號。
設計於1963年,ASCII是7位代碼,足夠存儲128個不一樣值。能夠表示大寫字母,小寫字母,數字0-9,特殊符號以及標點符號。
Unicode
解決ASCII
不夠表達全部語言的問題。
最多見的Unicode
是16位,有超過一百萬個位置。
這些標準歸根究竟是一長串位。
短信,視頻,互聯網上的每一個網頁,甚至操做系統,只不過是一長串1和0。
表示和存儲數字是計算機的重要功能,但真正的目標是計算,有意義的處理數字。
處理數字的操做由計算機的「算術邏輯單元(ARITHMETIC & LOGIC UNIT)」處理,稱之爲: ALU
英特爾74181:
第一個封裝在單個芯片內的完整ALU。
布爾邏輯,作一個簡單的ALU電路功能和 74181差很少。
ALU單元
ALU有2個單元,1個算術單元和1個邏輯單元。
算術單元:
負責計算機裏全部的數字操做,好比加減法,好比某個數字+1(增量運算)。
計算根本「把兩個數字相加」,能夠用單個晶體管一個個拼,把這個電路作出來,但很快就會複雜到難以理解。因此會使用更高層的抽象,用邏輯門來作。
最簡單的加法電路,是拿2個bit加在一塊兒(bit是0或1),有2個輸入:A和B,1個輸出:就是兩個數字的和。須要注意的是:A,B,輸出,這3個都是單個Bit(0或1),輸入只有四種可能。
0 + 0 = 0 1 + 0 = 1 0 + 1 = 1
二進制裏,1與true相同,0與false相同。
這組輸入和輸出,和XOR門的邏輯徹底同樣。
1 + 1 = 10
使用XOR
門不夠表示,須要一根額外的線表明「進位」。只有輸入是1和1時,進位纔是「true」,由於算出來的結果用1個bit存不下,能夠和AND
門一齊使用,構成半加器
半加器/全加器
兩個輸入 A 和 B都是1位,兩個輸出 「總和」與「進位」。
若是想處理超過1 + 1的運算,須要「全加器」。
101 101 ---- 1010
意味着,算下一列的時候,還有以後的每一列,得加3位在一塊兒,並非2個。
半加器:輸出了進位。
有3個輸入:A,B,C(都是1個bit)
因此,最大的多是:1 + 1 + 1
「總和」1,「進位」1,因此要二條輸出線: 「總和」和「進位」。
能夠用 半加器 作 全加器:
先用半加器將 A 和 B 相加,而後把C輸入到第二個半加器,最後用一個OR門檢查進位是否是true。
能夠再提高一層抽象,把全加器做爲獨立的組件。全加器會把A,B,C三個輸入加起來,輸出「總和」和「進位」。
獨立組件:
使用獨立組件,能夠相加兩個8位數字。
若是第9爲有進位,表明着2個數字的和太大了,超過了8位,叫作「溢出」。
通常來講「溢出」的意思是,兩個數字的和太大了,超過了用來表示的位數,這會致使錯誤和不可預期的結果。
著名的例子是:吃豆人,用8位存當前關卡數。若是玩到了第256關,ALU會溢出,形成一連串錯誤和亂碼,使得該關卡沒法進行。
避免溢出,能夠加更多的全加器,能夠操做16或32位數字。讓溢出更難發生,但代價是更多邏輯門,另一個缺點 ,每次進位都要一點時間。現在的量級是每秒幾十億次運算,因此會形成影響。因此,現代計算器用的加法電路有點不一樣,叫「超前進位加法器」。它更快,作的事情是同樣的:把二進制數相加。
ALU的算術單元,也能作一些其它數學運算,通常支持這8個操做:
就像加法器同樣,這些操做也是由邏輯門構成。
沒什麼魔法,只是更多邏輯門。
邏輯單元(LOGIC UNIT)
邏輯單元執行邏輯操做,AND
, OR
, NOT
操做。
也能作簡單的數值測試。好比一個數字是否是負數。
檢查ALU輸出是否爲0的電路:
使用一堆OR門檢查其中一位是否爲1,哪怕只有一個Bit(位)是1,就知道那個數字確定不是0,而後用一個NOT門取反。因此只有輸入的數字是0,輸出才爲1。
只是一大堆邏輯門巧妙的鏈接在一塊兒。
特殊符號來表示ALU:
8位ALU有兩個輸入,A和B,都是8位(bits),還須要告訴ALU執行什麼操做,例如加法或減法,因此用4位的操做代碼告知ALU,簡言之,"1000"可能表明加法命令,"1100"表明減法命令。
操做代碼告訴ALU執行什麼操做,輸出結果是8位的,ALU還會輸出一堆標誌(FLAG),「標誌」是1位的,表明特定狀態。好比相減兩個數字,結果爲0。
ALU經常使用標誌:
計算機是怎樣在沒有齒輪或槓桿的狀況下進行運算?
計算機須要一些「記憶」。
Memory (存儲 / 內存 兩種含義)
經過ALU計算出來的結果,須要找地方存儲,可能還須要進行多個連續操做。這就用到計算機內存了。
電腦用的是「隨機存取存儲器」,簡稱「RAM」。它只能在有電的狀況下存儲東西,好比遊戲狀態。
另一種存儲(memory)叫持久存儲,電源關閉時數據也不會丟失。
鎖存器
目前看到的電路都是單向的,老是向前流動。
迴向電路,把輸出連回輸入。
OR
門輸出連回輸入:
"0 OR 0"是0,因此電路輸出0。
若是將A變成1, "1 OR 0" 爲1,因此輸出1,連回輸入回到B, OR 門看到的是兩個輸入都是1。
"1 OR 1"仍然爲1,因此輸出不變。
若是A變成0,OR門依然輸出1。
AND
門輸出連回輸入:
"1 AND 1",永遠輸出1.
若是A設爲0,因爲是AND門,輸出會變成0. 這個電路能記錄0。
OR
門連回能存1的電路AND
門連回能存0的電路
爲了作出有用的存儲(memory),須要把兩個電路結合起來:
它有兩個輸入,"設置"輸入,把輸入變成1,"復位"輸入,把輸出變成0。
若是"設置"和"復位"都是0,電路會輸出最後放入的內容。也就是,它存儲了1位的信息。
這叫作鎖存,由於它「鎖定」了一個值,放入數據的動做叫作「寫入」,拿出數據的動做叫作「讀取」
簡化一個輸入:
將它設爲0或1,來存儲值,還須要一根線來「啓用」內存。啓用時容許寫入,沒啓用時就「鎖定」。
在此基礎上,加一些額外的邏輯門,能夠作出「門鎖」電路。由於門能夠打開和關上
把「門鎖」放到盒子裏,這個盒子能存一個bit:
一切從0開始,數據輸入從0換到1,從1換到0。
無論輸入1仍是0,輸出值都是0,由於容許寫入線是關閉的,因此內容不會變化。
打開「容許寫入線」輸入1,「打開」門,輸入數據是1,1就能在門鎖存起來,輸出也是1。如今關閉掉「容許寫入線」,輸出會保持1。無論輸入數據是什麼,輸出都是1。
寄存器
並排放8個鎖存器,能夠存8位信息,好比一個8 bit數字。
寄存器能存一個數字,這個數字有多少位,叫「位寬」。
寫入寄存器前,要先啓用裏面全部鎖存器。
64位寄存器要64根數據線,64根連到輸出端。只要1根線啓用全部鎖存器,但加起來也有129根線了。
若是256位寄存器要513根線。解決方法是矩陣
在矩陣中,不併列排放鎖存器,而是作成網格,存256位,用16 * 16 網格的鎖存器,有16行16列。
要啓用某個鎖存器,就打開相應的行線和列線。
打開交叉的鎖存器的「容許寫入線」,全部其它的鎖存器,保持關閉。
能夠增長AND
門,只有行線和列線均爲1,AND
門才輸出1.
因此能夠用選擇單個鎖存器,這種行/列排列法,用一根「容許寫入線」連全部鎖存器,爲了讓鎖存器變成「容許寫入」,行線,列線和「容許寫入線」都必須是1,每次只有1個鎖存器會這樣,表明能夠只用一根「數據線」鏈接全部鎖存器來傳數據。由於只有一個鎖存器會啓用,只有那個會存數據。其它鎖存器會忽略數據線上的值,由於沒有「容許寫入」。
「容許讀取線」來讀數據,從一個指定的鎖存器,讀取數據。因此對於256位的存儲,只要35根線。1條「數據線」,1條「容許寫入線」,1條「容許讀取線」,還有16行16列的線用於鎖存器(16 + 16 = 32, 32 + 3 = 35)。
須要某種方法來 惟一指定 交叉路口。
多路複用器
將地址轉成 行 和 列,須要「多路複用器」。
多路複用器有不一樣大小,由於有16行,須要1到16多路複用器。
工做方式:
輸入一個4位數字,它會把那根線,鏈接相應的輸出線。若是輸入0000,它會選擇第一列,若是選擇輸入0001,會選擇下一列,以此類推。
一個多路複用器處理(row), 另一個多路複用器處理列(column)。
把256位內存當成一個總體,它輸入一個8位地址:4位表明列,4位表明行,還須要「容許寫入線」和「容許許讀取線」。還須要一條數據線,用於讀/寫數據。256位內存,也無法作事情,因此還須要擴大規模。把它們並排放置。
並排放置,一行8個,能夠存一個8位數字,8位也叫作一個字節(byte),爲了存一個8位數字,同時給8個256位內存同樣的地址。每一個地址存1位,意味着下圖總共能存256個字節(byte)
不看做是一堆獨立的存儲模塊和電路,而是當作一個總體的可尋址內存。每一個地址能讀或寫一個8位值。
現代的計算機的內存擴展到上兆字節(MB)和千兆(GB)的方式,不斷把內存打包到更大規模,隨着內存地址增多,內存地址也必須增加。
8位最多能表明256個內存地址(11111111 是255, 0~255,一共256個數字),要給千兆或十億字節的內存尋址,須要32位的地址。
8個模塊
內存的一個重要特性是:能夠隨時訪問任何位置。
「隨機存取存儲器」,簡稱RAM
:
RAM
就像人類的短時間記憶,記錄當前在作什麼事。
把內存中某塊放大,看到32個內存方塊;放大其中一個方塊,能夠看到有4個小塊;若是再放大,能夠看到存「位」的矩陣,這個矩陣是128 * 64位,總共是8192位。
每一個方格4個矩陣,因此一個方格有32768(8192 * 4 = 32768)位(bits)。
一共32個方格,一個芯片大約存100萬(8192 4 32 = 1048576)位。RAM
有8個芯片,因此總共800萬位,也就是1兆字節(1 MB)
用鎖存器完成了一塊SRAM
(靜態隨機存取存儲器),還有其它類型的RAM
,例如閃存和NVRAM
,它們在功能上與SRAM
類似,但用不一樣的電路存單個位。好比用不一樣的邏輯門,電容器,電荷捕獲或憶阻器。但根本上,這些技術都是矩陣層層嵌套,來存儲大量信息。