使用補碼(最高位是負權重)表示帶符號數,既可以表示正數也可以表示負數。
表示無符號數就比較簡單了,每位都是正權重。
補碼的特點
- 當最高位是0時,相同有符號數和無符號數的位模式是一樣的
- 負的取值范圍要比正的多1
補碼表示的實際好處
- 取負數就是所有位取反加一
- 有符號轉無符號如果為正數,就直接轉了,如果是有符號,就加上最高位權重的雙倍
- 無符號轉有符號如果最高位為0,就直接轉了,否則就減去最高位權重的雙倍
- 使用算術右移就能方便的進行位擴展
需要注意的點
- 對有符號數來說,x - y > 0 和 x > y可不一樣,前者可能會造成正溢出或者負溢出
- 有符號和無符號的轉換保持位不變
- T2U=(T2B(B2U))而且是雙射的,只是改變了其解釋方式而已,所以將-1轉換為unsigned可以得到UMax。T2U有個公式,是分段函數,可以簡單的推導出來。
- U2T=(U2B(B2U))也是雙射的,也有個公式是分段函數,可以簡單的推導出來
- 補碼可以任意符號擴展而保持值不變,推導用數學歸納法,無符號數則只需要補0
- 無符號數的截斷(舍去高位)可以用取余來得到結果,推導不難;補碼截斷的結果則是先利用無符號截斷的性質,再使用U2T函數得到。