CS:APP CP2 信息的表示和處理
數據的機器表示
- 大端法: 高位在前
- 小段法: 低位在前
C語言的移位操作
- 左移:直接左移右邊補0
- 算數右移:右移時左邊補最高位
- 邏輯右移:右移時左邊補0
操作 | 值 |
---|---|
x | [10010] |
x << 3 | [10000] |
x >> 3(算數右移) | [11110] |
x >> 3(邏輯右移) | [00010] |
數據的三種碼錶示
原碼
原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其餘位表示值. 比如如果是8位二進制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符號位. 因爲第一位是符號位, 所以8位二進制數的取值範圍就是:
[1111 1111 , 0111 1111]
即
[-127 , 127]
原碼是人腦最容易理解和計算的表示方式.反碼
反碼的表示方法是:
正數的反碼是其本身
負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可見如果一個反碼錶示的是負數, 人腦無法直觀的看出來它的數值. 通常要將其轉換成原碼再計算.補碼
補碼的表示方法是:
正數的補碼就是其本身
負數的補碼是在其原碼的基礎上, 符號位不變, 其餘各位取反, 最後+1. (即在反碼的基礎上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]補
[-1] = [10000001]原 = [11111110]反 = [11111111]補
對於負數, 補碼錶示方式也是人腦無法直觀看出其數值的. 通常也需要轉換成原碼在計算其數值.
C語言類型轉換
C語言強制類型轉換是改變了解釋數字的位的解釋方式,真實的位表示沒有變化
當把 x
強制從int
轉換成short
時,將高位截斷。
整型運算與溢出
移位運算表示的乘除
乘以常數
例如要表示x∗m - 當
m=2k 時,等價於x << k
- 當
m 無法用2k 來表示時,如m=14 , 可以將 14表示成14=24−21 ,此時用移位運算表示爲(x << 4) - (x << 1)
(乘法運算可能導致溢出,但即使溢出,移位運算與表達式求值結果也是相同的)
- 當
除以2的冪
除法不同於乘法,不能用移位運算表示任意常數的除法,只能除以2的冪- 當x > 0 或者爲無符號數時,
x/2k =x >> 2
- 當x < 0,由於移位除法統一向下取整,而實際上x爲負數時除法是向上取整,所以有
x/2k =(x + (1 << k) - 1) >> k
。
解釋:對於任意整數x
和任意y > 0
,有⌈x/y⌉ =⌊(x+y−1)/y⌋ .
- 當x > 0 或者爲無符號數時,