1. 程式人生 > >《深入理解計算機系統(第三版)》第二章學習總結

《深入理解計算機系統(第三版)》第二章學習總結

第二章:資訊的表示和處理

1.二進位制與十六進位制:

①十六進位制數字:0 – F,例子:25A4B
② 二進位制數字:0 – 1,例子:0001 0111 0011 1010 0100 1100
③相互轉換:十進位制→ 十六進位制:Mod(10,16)(倒序排列)

2.字和資料大小:

① 字長決定了系統虛擬地址空間的最大大小,對於典型32位機器而言,虛擬地址範圍為0 - 232-1,程式最多訪問232,所以32位機器支援最大記憶體為4G。
②一般資料型別的位元組數,重點為指標型別的位元組數為全字長。

3.定址和位元組順序:

分為大端法和小端法,IBM和Sun的個人計算機通常使用大端法。

4.布林代數與位級運算:

①基本位運算子:|(邏輯或),&(邏輯與),~(邏輯非),^(邏輯異或)
②重要結論:a^a = 0(通過異或交換兩個變數的值)

5.移位運算及其重要結論:

6.整數的表示:

①無符號數的編碼.
②補碼的編碼.
③有符號數與無符號數之間的轉換.
④截斷數字.

7.整數運算:

①無符號數的加法:
重要結論:模數加法形成了阿貝爾群,可交換結合,每個元素都有一個加法逆元。
②補碼加法;
③補碼的非;
④無符號乘法;
⑤補碼乘法:
重要結論:設為二進位制表示的無符號整數,對於任意k0,有以下公式:
即:一個二進位制表示數乘以,相當於在位模式右邊補了k個0(不溢位的情況),相當於一種移位操作,C表示式中x << k等價於 x * pwr2k,許多C語言編譯器檢視以移位,加法和減法的組合來消除很多整數乘以常數的情況。
例如:x*14,利用等式14=,編譯器將乘法重寫為(x<<3)+(x<<2)+(x<<1),實現將一個乘法替換為三個移位運算和三個加法,減少時鐘週期提高運算效率。
⑥補碼除法:
向零舍入:即乘法的逆運算,執行算數右移k位即除以,因為移位導致結果向下舍入,根據向零舍入的要求,通過偏置, = 可以得到正確的舍入結果。

8. 浮點數的IEEE表示:

① IEEE浮點表示:

  1. 符號:s通過其值1負和0正決定V的正負,對於V=0另作解釋。
  2. 尾數:M是一個二進位制小數,它的範圍是1 – 2-ε,或者0 – 1-ε
  3. 階碼:E的作用是對浮點數加權,權重是2的E次冪(可能是負數)

②通過將浮點數的位劃分為3個欄位,分別進行編碼,類似科學計數法:

  1. 1個單獨的符號位s,直接編碼符號s
  2. k位的階碼欄位,exp=ek-1···e0,編碼解碼E
  3. n位的小數字段,frac=fn-1···f0,編碼尾數M,但是該值依賴於E是否為0

③ 浮點表示的三種情況:

  1. 規格化的值:
    普遍情況,當exp不全為0,也不全為1,此情況解碼以偏置形式表示有符號整數,即E = e – Bias,e是無符號數,e表示為階碼位的編碼ek-1···e0,而Bias是一個等於(單精度k=8,雙精度k=11)的偏置值,由此產生指數的取值範圍即:(單精度-126~+127,雙精度-1022~+1023),對於frac解釋為描述小數值f,期中0≤f<1,其二進位制表示為0.fn-1···f0,當尾數定義為M
    = 1+f時,叫做隱含以1開頭的表示,所以M = 1.fn-1···f0,因為二進位制的基數是2,且我們總能在不溢位的範圍內調整階碼,使得尾數M的範圍總在1≤M<2中,符合IEEE定義M的範圍,從而表示小數。
  2. 非規格化的值:
    當階碼exp域全0,階碼值為E = 1-Bias,而尾數值為M = f,不包含隱含開頭都 1(為什麼),非規格化的值用來表示0和非常接近0的小數,因為規格化要求M≥1,所以無法表示0,實際上+0.0的浮點表示位模式全0,而當符號位為1時候得到-0.0,逐漸溢位的屬性使得數值均勻的接近0.0(?)
  3. 特殊值:
    當階碼exp域全1,當frac全0表示無窮,根據符號位的表示的正負來確定正負無窮,無窮能表示溢位的結果,當小數域非零時,NaN被稱為不是一個數的縮寫,一些運算結果為虛數,無法表示。

9.浮點表示的整數與補碼錶示整數之間的關係:

以十進位制數12345為例,其補碼二進位制表示為[00000000000000000000001100000011 1001],用IEEE浮點型表示,將小數點左移13位,得到12345 = 1.10000001110012,丟棄開頭1,由於32位s=1,k=8,n=23,所以在末尾追加10個0,得到[10000001110010000000000],即frac欄位,因為E = e – Bias,即e = 13 + 127,得其階碼二進位制表示為10001100,加上符號為0,得到單精度12345二進位制表示為[01000110010000001110010000000000],與[000000000000000000000011000000111001]在紅線處相同,這說明相關區域對應整數低位,恰好在等於1的最高位之前相同,因為此標準略去開頭位1,其餘部位都是相配的。

10.舍入規則:

向偶數舍入:使得最低有效位為偶數的舍入方法,來確定浮點數的近似值(IEEE預設)。

11.浮點運算:

1.IEEE定義簡單規則:把浮點值x,y看成實數,某個運算⊙定義在實數上,算數計算產生Round(x⊙y),其結果對精確結果進行了舍入。
2.浮點運算因為精度受限不滿足結合律,例如:(3.14+e10)-e10=0.0,3.14+(e10-e10)=3.14,這是浮點運算構成代數系統最缺少的群屬性。
3.浮點數滿足單調性屬性,如果有a≥b,則有x + a≥x + b(?)
4.C語言雖然有float和double型別,但是未明確要求機器滿足IEEE標準。

總結:

精讀第二章之後,我們更加深刻地理解了什麼叫做資訊=位+上下文,可以這樣說:系統中所有的資訊——包括磁碟檔案、儲存器中的程式、儲存器中存放的使用者資料以及網路上傳送的資料,都是一串位元表示的。區分不同資料物件的唯一方法是我們讀到這些資料物件時的上下文。比如,在不同的上下文中,同樣的位元組序列可能表示一個整數、浮點數、字串或者及其指令。