惡補一下原碼反碼補碼,忘記的童鞋也可以看看
未經本人同意不得用於獲取積分等。
轉載請註明,http://blog.csdn.net/tryhl/article/details/42098871,謝謝!!!!
歡迎加入 java學習分享羣:316297243,一起學習
1.回顧計算機表示數字
原碼、反碼、補碼的誕生都是爲了表示數據,只不過是三種不同的編碼方式而已。
十進制15,-15大家都知道代表什麼,如果直接把這個呈現給計算機,計算機肯定是醉了,不知道這是什麼。因爲計算機只認識0,1這兩個數字。
數字在計算機中是用機器數表示的(一個數在計算機中的二進制表示形式,叫做這個數的機器數),在計算機用一個數的最高位存放符號,正數爲0,負號爲1。
例如:+3機器數表示爲 00000011,-3表示爲10000011。
+3的第一位0是表示正數,0000011表示值3,所以爲+3
-3的第一位是1表示負數,0000011表示值3,所以爲-3.
2.原碼 反碼 補碼的定義
原碼:符號位加上真值的絕對值,即用第一位表示符號,其餘位表示值。其實上面的表示一樣。
例如:[+1]原碼=[0000 0001] [-1]原碼=[1000 0001]
因爲第一位是符號位,所以8位的二進制數範圍爲
-27 + 1到27 - 1 即 -127到127
原碼我們人最容易識別和判斷,計算機也能夠識別。
按理說反碼和補碼就不應該在出現在這個世界上,但是它們既然出現了,肯定有它們的道理。
反碼:整數的反碼是其本身,負數的反碼是在其原碼的基礎上,符號位不變,其餘各個位取反。
其範圍也是-27 + 1到27 - 1 即 -127到127
例如:[+1]原碼=[0000 0001] [+1]原碼=[0000 0001]
[-1]原碼=[1000 0001] [-1]反碼=[1111 1110]
如果一個表示負數的反碼人腦是無法直接判斷出來負數的值。
爲什麼會有反碼呢?因爲在計算機中進行加減的需求,大家都知道讓計算機去識別減法會相當的複雜,但是如果識別加法會比較容易。但是減法是可以用加法來表示的。
例如:
利用原碼進行加減:
1-1=1+(-1)=[0000 0001]原碼 +[1000 0001]原碼=[1000 0010]原碼=-2顯然不對。
利用反碼進行加減:
1-1=1+(-1)=[0000 0001]反碼 +[1111 1110]反碼=[1111 1111]反碼=-0
計算的結果是正確的,因爲按照我們的理解-0就是0,帶符號的0是沒有任何意義的。所以[0000 0000]反碼、 [1111 1111]反碼都表示0,可想而知一個數字可以有兩種表達形式,顯然是不行的。所以引入了補碼。
補碼:正數的補碼是其本身,負數的補碼是在其原碼基礎上,符號位不變,其餘各位取反,最後加1(也就是在反碼的基礎上加1)。
因爲當時負數時加1,所以
1-1=1+(-1)=[0000 0001]補碼 +[1111 1111]補碼=[0000 0000]補碼=0
2-1=2+(-1)=[0000 0010]補碼 +[1111 1111]補碼=[0000 0001]補碼=1
這樣0用[0000 0000]表示, 而以前出現問題的-0則不存在了.而且可以用[1000 0000]表示-128:
(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]補 + [1000 0001]補 = [1000 0000]補
-1-127的結果應該是-128, 在用補碼運算的結果中, [1000 0000]補 就是-128. 但是注意因爲實際上是使用以前的-0的補碼來表示-128, 所以-128並沒有原碼和反碼錶示.(對-128的補碼錶示[1000 0000]補算出來的原碼是[0000 0000]原, 這是不正確的)
使用補碼, 不僅僅修復了0的符號以及存在兩個編碼的問題, 而且還能夠多表示一個最低數. 這就是爲什麼8位二進制, 使用原碼或反碼錶示的範圍爲[-127, +127], 而使用補碼錶示的範圍爲[-128, 127].
參考文章:http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html