原碼補碼反碼

惡補一下原碼反碼補碼,忘記的童鞋也可以看看

未經本人同意不得用於獲取積分等。

轉載請註明,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位的二進制數範圍爲

-2+ 12- 1   即 -127127

原碼我們人最容易識別和判斷,計算機也能夠識別。

按理說反碼和補碼就不應該在出現在這個世界上,但是它們既然出現了,肯定有它們的道理。


  反碼:整數的反碼是其本身,負數的反碼是在其原碼的基礎上,符號位不變,其餘各個位取反。

其範圍也是-2+ 12- 1   即 -127127

例如:[+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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章