這是一篇關(guān)于帶符號二進制數(shù)據(jù)在計算機中表示方法及加減運算的文章,是《計算機原理》這門課程有關(guān)內(nèi)容的總結(jié)性筆記廉沮。
01 機器數(shù)表示方式
1 機器數(shù)表示方式
- 原碼
- 補碼
- 反碼
2 原碼表示法
又稱帶符號的絕對值表示村斟。
- 符號位:
“0”——正號
“1”——負號
- 有效數(shù)值部分:
二進制的絕對值
3 補碼表示法
正數(shù)的補碼是正數(shù)本身奶陈,負數(shù)的補碼是原負數(shù)加上模。
那什么是模呢蔚舀?內(nèi)容轉(zhuǎn)自
3.1模
模是指一個計量系統(tǒng)的計數(shù)范圍饵沧。如時鐘等锨络,計算機也是一個計算器,它也是有一個計量范圍狼牺,即都存在一個“南鄱”。
- 如時鐘的計量范圍是0~11是钥,模 = 12
- 32位計算機的計量范圍是2^32掠归,模 = 2^32
模是計量器產(chǎn)生“溢出”的量,它的值在計量器上表示不出來悄泥,計量器上只能表示出模的余數(shù)虏冻,如12的余數(shù)有0,1,2,3,4,5,6,7,8,9,10,11。
知道了模码泞,我們再來看看補數(shù)
3.2 補數(shù)
假設(shè)當前時針指向11點兄旬,而準確時間是8點,調(diào)整時間可有以下兩種撥法:
- 一種是倒撥3小時余寥,即:
11-3=8
- 另一種是順撥9小時:
11+9=12+8=8
在以模為12的系統(tǒng)中领铐,加9和減3效果是一樣的,因此凡是減3運算宋舷,都可以用加9來代替绪撵。對“模”12而言祝蝠,9和3互為補數(shù)(二者相加等于模)音诈。所以我們可以得出一個結(jié)論,即在有模的計量系統(tǒng)中绎狭,減一個數(shù)等于加上它的補數(shù)细溅,從而實現(xiàn)將減法運算轉(zhuǎn)化為加法運算的目的。
3.3 補碼原理
計算機上的補碼就是算術(shù)里的補數(shù)儡嘶。
設(shè)我們有一個4
位的計算機喇聊,則其計量范圍即模是2^4 = 16
,所以其能夠表示的范圍是0~15
蹦狂,現(xiàn)在以計算 5 - 3
為例誓篱,我們知道在計算機中,加法器實現(xiàn)最簡單凯楔,所以很多運算最終都要轉(zhuǎn)為加法運算窜骄,因此5-3
就要轉(zhuǎn)化為加法:
# 按以上理論,減一個數(shù)等于加上它的補數(shù)摆屯,所以
5 - 3
# 等價于
5 + (16 - 3) // 算術(shù)運算單元將減法轉(zhuǎn)化為加法
# 用二進制表示則為:
0101 + (10000 - 0011)
# 等價于
0101 + ((1 + 1111) - 0011)
# 等價于
0101 + (1 + (1111 - 0011))
# 等價于
0101 + (1 + 1100) // 括號內(nèi)是3(0011)的反碼+1邻遏,正是補碼的定義
# 等價于
0101 + 1101
# 所以從這里可以得到
-3 = 1101
# 即 `-3` 在計算機中的二進制表示為 `1101`,正是“ -3 的正值 3(`0011`)的補碼(`1101`)”。
# 最后一步 0101 + 1101 等于
10010
3.4 補碼定義
這里需要解釋一下党远,為什么純小數(shù)的模值為2削解。從上面的解釋我們知道富弦,模就是計量器產(chǎn)生“溢出”的量沟娱,那么對于一個純小數(shù)(一位符號位)其表示范圍為0.0000……00~1.1111……11
,溢出值是10.0000......00
腕柜,它的模是2济似。
3.5 由原碼求補碼
- 正數(shù):[X]補=[X]原
- 負數(shù):符號位除外,各位取反盏缤,末位加1
4 反碼表示法
反碼只用于由原碼求補碼或由補碼求原碼的中間過渡
正數(shù)的反碼與原砰蠢、補碼相同
負數(shù)的反碼符號位1,數(shù)值位是將原碼的數(shù)值按位取反
02 加減法運算及溢出處理
1 計算機中常用補碼進行加減運算
這主要是因為相較原碼唉铜,補碼有以下特點:
- 減法運算通過加法運算實現(xiàn)
- 運算時符號位參與運算且結(jié)果符號自動產(chǎn)生
2 定點補碼加減法運算
基本規(guī)則
兩個補碼的和/查等于和/差補碼
即:[X]補±[Y]補 = [X±Y]補 mod 2或2^n
舉例
3 運算溢出與溢出處理
溢出
溢出:運算結(jié)果超出機器數(shù)所能表示的范圍
- 一旦發(fā)生溢出台舱,運算結(jié)果就不正確
- 必須將溢出錯位檢出
- 溢出只可能發(fā)生在兩個同號數(shù)相加或兩個異號數(shù)相減時
4 溢出判斷
單符號位判斷法
-
結(jié)果符號判斷法
- 同號相加:結(jié)果符號與被加數(shù)相異則溢出
- 異號相減:結(jié)果符號與被減數(shù)相異則溢出
-
進位符號判斷法
- 數(shù)值最高位進位值與符號位進位相異則溢出
雙符號位判別法:通過實現(xiàn)變形補碼實現(xiàn)
雙符號位參與運算,結(jié)果雙符號位相異則溢出
00:正數(shù)潭流,11:負數(shù)竞惋,01:正溢出,10:負溢出
第一位符號位為運算結(jié)果的真正符號位