《CSAPP》 Review 2: 數據

32位/64位

首先考慮一個咱們常常看到的詞——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時表示正數。
  • 由上條可推出,有符號數的最小值爲100…00,也就是最高位的權重(- 2 ^ (w - 1));最大值爲011…11,即(2^(w-1) - 1)
  • 須要拓寬有符號數時:
    • 當最高位爲0,則能夠在高位直接補0拓寬,數值不變;
    • 當最高位爲1時,補0會改變其符號,應該在高位補1,能夠經過例子理解一下:有符號二進制數101換算成十進制就是-3,前面補1,110一、11101算下來則還是-3。
  • 當有符號數發生溢出發生高位截斷,但原理仍是「減去」丟棄的位數與其權重的乘積,只不過當最高位爲1時,權重爲負,注意減去的是負值便可。

搞清楚原碼和補碼編碼之後,就能夠由此推導出整數的各類運算以及與有符號數與無符號數之間的轉換了,本文再也不贅述,讀者能夠本身推一推。


浮點數

最後一個問題是浮點數。

浮點數的表示能夠分爲三部分,總共32/64位:

  • 1位符號位s,s爲1是表示負數,s爲0表正數;
  • e位整數部分,在C語言中,float類型的e爲8,double類型的e爲11,表示的整數大小與二進制數值相同;
  • m位小數部分,C語言中佔23位(float)或52位(double),表示的大小爲「1.m」,好比m爲01001,則表示1.01001。

最終表示的數值 = ((-1)^s) * (1.m) * (2^e)

這樣的編碼還有一些盲區:沒法表示0~1之間的數;沒法表示正負無窮和NaN。因而計算機規定了這些數值的表示方法:

  • 當00...00 < e < 11...11時,正常表示((-1)^s) * (1.m) * (2^e)
  • 當e = 00...00,即整數部分爲0時,m的數值大小變爲「0.m」,即((-1)^s) * (0.m)
  • 當e = 11...11,m = 00...00時,表示無窮,由符號位s來區分正無窮和負無窮;
  • 當e = 11...11,m不爲0時表示NaN。

浮點數用於計算時採用「偶舍入」的方法,即「四捨六入,五取偶數」。

  • 如:1.4舍爲1,1.6入爲2,但1.5和2.5都會舍入爲2,由於2爲偶數。

「偶攝入」可避免統計誤差,由於原數末尾大於或小於一個偶數的機率相等,因此將原數變大或減少的機率是相等的。

理解了浮點運算的編碼規則,就能夠推出浮點運算的運算律:

  • 具備交換律
  • 不具備結合律,如 (3.14 + 1e10) - 1e10 會被舍入爲0.0,而 3.14 + (1e10 - 1e10) 結果則爲3.14
  • 浮點乘法不具備分配律
  • 浮點加法知足單調性:若是a > b,則(a+x) > (b+x),無符號和補碼加法因爲可能溢出舍入,不具備此單調性。
相關文章
相關標籤/搜索