CS-APP CP2 信息的表示和處理

CS:APP CP2 信息的表示和處理


數據的機器表示

  • 大端法: 高位在前
  • 小段法: 低位在前

C語言的移位操作

  • 左移:直接左移右邊補0
  • 算數右移:右移時左邊補最高位
  • 邏輯右移:右移時左邊補0
操作
x [10010]
x << 3 [10000]
x >> 3(算數右移) [11110]
x >> 3(邏輯右移) [00010]

數據的三種碼錶示

  1. 原碼
    原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其餘位表示值. 比如如果是8位二進制:
    [+1]原 = 0000 0001
    [-1]原 = 1000 0001
    第一位是符號位. 因爲第一位是符號位, 所以8位二進制數的取值範圍就是:
    [1111 1111 , 0111 1111]

    [-127 , 127]
    原碼是人腦最容易理解和計算的表示方式.

  2. 反碼
    反碼的表示方法是:
    正數的反碼是其本身
    負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反.
    [+1] = [00000001]原 = [00000001]反
    [-1] = [10000001]原 = [11111110]反
    可見如果一個反碼錶示的是負數, 人腦無法直觀的看出來它的數值. 通常要將其轉換成原碼再計算.

  3. 補碼
    補碼的表示方法是:
    正數的補碼就是其本身
    負數的補碼是在其原碼的基礎上, 符號位不變, 其餘各位取反, 最後+1. (即在反碼的基礎上+1)
    [+1] = [00000001]原 = [00000001]反 = [00000001]補
    [-1] = [10000001]原 = [11111110]反 = [11111111]補
    對於負數, 補碼錶示方式也是人腦無法直觀看出其數值的. 通常也需要轉換成原碼在計算其數值.

C語言類型轉換

C語言強制類型轉換是改變了解釋數字的位的解釋方式,真實的位表示沒有變化
當把 x強制從int轉換成short時,將高位截斷。

整型運算與溢出

參考此篇文章

移位運算表示的乘除

  1. 乘以常數
    例如要表示 xm

    • m=2k 時,等價於 x << k
    • m 無法用 2k 來表示時,如 m=14 , 可以將 14表示成 14=2421 ,此時用移位運算表示爲(x << 4) - (x << 1)
      (乘法運算可能導致溢出,但即使溢出,移位運算與表達式求值結果也是相同的)
  2. 除以2的冪
    除法不同於乘法,不能用移位運算表示任意常數的除法,只能除以2的冪

    • 當x > 0 或者爲無符號數時,x/2k = x >> 2
    • 當x < 0,由於移位除法統一向下取整,而實際上x爲負數時除法是向上取整,所以有 x/2k = (x + (1 << k) - 1) >> k
      解釋:對於任意整數 x和任意 y > 0,有x/y = (x+y1)/y .
發佈了29 篇原創文章 · 獲贊 12 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章