有符號整數在電腦中的表示方法
- 2020 年 7 月 1 日
- 筆記
數據在電腦中都是以0和1來存儲的,我們的有符號數也不例外,我們這次就要明白有符號數是以什麼的規律存儲的,又為什麼用這種規律存儲的
當我們要存儲一個有符號數字的時候,我們不僅要把數字的大小存儲起來,同時還要存儲它的符號(正或負),所以我們的有符號數字可以這樣存儲:用來表示數字正負的符號位+用來表示數字大小的數據位,這便引出了我們要說到的原碼
- 原碼
原碼是一種電腦中對數字的二進位定點表示方法, 原碼錶示法在數值前面增加了一位符號位(即最高位為符號位):正數該位為0,負數該位為1,其餘位表示數值的大小
那我們就用原碼來表示一下數據吧(8位)
+67:
-25 :
+67為正數,所以我們最高位為0,然後我們將67轉為二進位就是1000011
,我們將符號位和數據位合起來就得到了圖片中的01000011
,-25同理
需要注意的是在原碼的表達方式中,0有兩個編碼值,我稱之為+0和-0,+0是
00000000
,-0是10000000
,所以8位原碼能表達的有符號數範圍為-127~+127
對於數值的表示我們做完了,那是不是代表這個方式能直接用呢?不是的,我們還要看這樣的表達方式在運算的時候會不會出錯,在這裡我只使用簡單的加減法進行證明:
01000011+00011001
+67加+25,通過二進位的加法,我們可以得到答案為01011100
為+92,是正確的
11000011+10011001
-67加-25,通過二進位的加法,我們可以得到答案為01011100
為+92,很明顯是錯誤的
01000011+10011001
+67加-25,通過二進位的加法,我們可以得到答案為11011100
為-92,很明顯也是錯誤的
所以我們可以得到一個顯而易見的結論,原碼適合數字的表示,但是在進行運算的時候並不能得到正確的答案,所以我們是不能用原碼的形式來存儲數據的,於是我們要用別的規則了,這個規則叫反碼
- 反碼
如果是正數,則反碼錶示方法和原碼一樣;如果是負數,符號位不變,其餘各位取反,則得到這個數字的反碼錶示形式. 補碼是電腦表示數據的一般方式,其規則為:如果是整數,則表示方法和原碼一樣.如果是負數,則將數字的反碼加上1(相當於將原碼數值位取反然後在最低位加1)
同樣的,我們使用反碼的方式把剛剛的數字再表示一次:
+67:
-25 :
正數和原碼一樣,而反碼是需要將原碼中的數據位都要取反的,0011001
取反為1100110
,所以我們得到了在反碼的規則下-25的二進位
同樣需要注意的是在反碼的表達方式中,0有兩個編碼值,我稱之為+0和-0,+0是
00000000
,-0是11111111
,所以8位反碼能表達的有符號數範圍也是-127~+127
同樣的,我們需要看在這個規則下的運算結果是否正確:
01000011
+00011001
+67加+25,通過二進位的加法,我們可以得到答案為01011100
為+92,是正確的
10111100
+11100110
-67加-25,通過二進位的加法,我們可以得到答案為10100010
,我們將其轉為原碼的形式為11011101
為-93,很明顯是錯誤的,但是我們能發現和標準答案-92已經很接近了
01000011
+11100110
+67加-25,通過二進位的加法,我們可以得到答案為00101001
為+41,很明顯也是錯誤的,但是我們發現和正確答案+42也是非常接近的
通過上述的觀察,我們發現反碼也是不能用來存儲的,因為運算結果仍然是不對的,但是我們發現在有負數加入運算的時候,運算結果只和正確答案相差1,所以我們是否可以在反碼的規則上增加一條規則,讓運算結果正確,加減法統一處理呢,是可以的,這個就叫補碼
- 補碼
正整數的補碼是其二進位表示,與原碼相同,而負整數的補碼是將其原碼除符號位外的所有位取反後加1
+67:
-25 :
正數和原碼一樣,而反碼是需要將原碼中的數據位取反再加一個1的,0011001
取反為1100110
,然後我們再+1得1100111
,所以我們得到了在補碼的規則下-25的二進位
在補碼的表達方式中,0隻有一個編碼值,之前的+0和-0都是
00000000
,所以8位補碼能表達的有符號數範圍為-127~+128
同樣的,我們繼續進行論證:
01000011
+00011001
+67加+25,通過二進位的加法,我們可以得到答案為01011100
為+92,是正確的
10111101
+11100111
-67加-25,通過二進位的加法,我們可以得到答案為101000100
,我們將其轉為原碼的形式為11011100
為-92也是正確的
01000011
+11100111
+67加-25,通過二進位的加法,我們可以得到答案為00101010
為+42很明顯也是正確的
原碼是表示數據最直觀的,但是結果也是最不準確的,而補碼雖然不直觀,但是存儲在電腦中是最合適的,所以我們的有符號整數在電腦中就是以補碼的形式存儲的,使用補碼,可以將符號位和數值域統一處理,同時,加法和減法也可以統一處理,對電腦來說是一個很好的選擇