首先考慮一個咱們常常看到的詞——32位/64位系統。編碼
咱們知道,計算機使用二進制數來存儲信息,1位就是一個0或1的數字,32位系統指的是該系統的指針採用32位二進制數來表示。指針
指針的做用是指向一個虛擬內存地址(虛擬內存後面會講,此處可看成內存來理解),也就是說,內存中的每一塊都對應一個獨有的指針的值。32位二進制能夠表示的數的範圍是0到2^32 - 1
,也就是0到4294967296,最大值換算一下就是4千兆字節(4GB)。因此說,老的32位系統最大支持的內存就是4GB,再大的話,指針就沒法表識,也就沒法識別和使用超出4GB的內存區域了。code
對於64位系統是同理的,64位系統的指針長度至關於32位指針長度的32次方,高達16EB!(1EB = 1024PB = 1024*1024TB = 1024*1024*1024GB
)內存
接下來要討論一個常見問題——單位。數學
1bit(1位)表示二進制數字的1位;1Byte(1字節)表示8位二進制數,它是計算機中表示、傳輸和操做數據的最小單位。it
注意,1B=1Byte,1b=1bit,計算機中99%的狀況下使用的都是Byte字節,bit位能夠只把它看成一個數學定義。class
平常生活中不少人認爲運營商坑爹,百兆寬帶下載速度才十幾兆,其實就是通訊領域和計算機領域中採用的數據單位不一樣而致使的誤解。運營商宣稱的網速單位是b/s,而咱們實際在計算機中看到的網速單位是B/s。百兆寬帶的100Mb/s除以8,也就是咱們在計算機中看到的網速峯值12.5MB/s。原理
計算機中除字節外,另外一個重要單位就是字長,字長其實在開頭第一個問題就講過了,指明的就是指針數據的標稱大小。下載
第三個問題是整數。二進制
計算機中將整數分爲無符號數和有符號數,用一個字長來表示,無符號數與有符號數的編碼方式不一樣,致使數值範圍、運算方式和溢出結果都極爲不一樣。接下來的講述用w來表識字長,w值爲32或64。
先說無符號數,也就是大於等於0的整數,無符號數的表示和運算很直觀,與二進制對應: 第 i 位的權重就是2 ^ (i - 1)
,其範圍是0 ~ (2^w - 1)
。
當無符號數不足w位須要拓寬時,在數值前面補0,大小不變;
當計算出的無符號數超過w位發生溢出時,其高位會被截斷丟棄,結果會減去丟棄的位數與其權重的乘積。例如無符號數1011001,假設w=5,則結果被截斷爲11001。
有符號數的表示和運算是本章的難點,但搞清楚原理就能夠推導出各類結果了。有符號數採用「補碼」的編碼方式,與無符號數的區別是:
(2 ^ (w - 1))
,而是複數(- 2 ^ (w - 1))
,同時也做爲符號位:最高位爲1時表示負數,爲0時表示正數。(- 2 ^ (w - 1))
;最大值爲011…11,即(2^(w-1) - 1)
。搞清楚原碼和補碼編碼之後,就能夠由此推導出整數的各類運算以及與有符號數與無符號數之間的轉換了,本文再也不贅述,讀者能夠本身推一推。
最後一個問題是浮點數。
浮點數的表示能夠分爲三部分,總共32/64位:
最終表示的數值 = ((-1)^s) * (1.m) * (2^e)
這樣的編碼還有一些盲區:沒法表示0~1之間的數;沒法表示正負無窮和NaN。因而計算機規定了這些數值的表示方法:
((-1)^s) * (1.m) * (2^e)
;((-1)^s) * (0.m)
;浮點數用於計算時採用「偶舍入」的方法,即「四捨六入,五取偶數」。
「偶攝入」可避免統計誤差,由於原數末尾大於或小於一個偶數的機率相等,因此將原數變大或減少的機率是相等的。
理解了浮點運算的編碼規則,就能夠推出浮點運算的運算律: