1. 程式人生 > >為什麼-128用二進位制表示為1000000000000000?

為什麼-128用二進位制表示為1000000000000000?

    在計算機內部,所有資訊都是用二進位制數串的形式表示的。整數通常都有正負之分,計算機中的整數分為無符號的和帶符號的。無符號的整數用來表示0和正整數, 帶符號的證書可以表示所有的整數。由於計算機中符號和數字一樣,都必須用二進位制數串來表示,因此,正負號也必須用0、1來表示。通常我們用最高的有效位來 表示數的符號(當用8位來表示一個整數時,第8位即為最高有效位,當用16位來表示一個整數時,第16位即為最高有效位。)0表示正號、1表示負號,這種 正負號數字化的機內表示形式就稱為“機器數”,而相應的機器外部用正負號表示的數稱為“真值”。將一個真值表示成二進位制字串的機器數的過程就稱為編碼。

    無符號數沒有原碼、反碼和補碼一說。只有帶符號數才存在不同的編碼方式。

帶符號整數有原碼、反碼、補碼等幾種編碼方式。原碼即直接將真值轉換為其相應的二進位制形式,而反碼和補碼是對原碼進行某種轉換編碼方式。正整數的原 碼、反碼和補碼都一樣,負數的反碼是對原碼的除符號位外的其他位進行取反後的結果(取反即如果該位為0則變為1,而該位為1則變為0的操作)。而補碼是先 求原碼的反碼,然後在反碼的末尾位加1 後得到的結果,即補碼是反碼+1。IBM-PC中帶符號整數都採用補碼形式表示。(注意,只是帶符號的整數採用補碼儲存表示的,浮點數另有其儲存方式。)

    採用補碼的原因或好處如下。

    採用補碼運算具有如下兩個特徵:

    1)因為使用補碼可以將符號位和其他位統一處理,同時,減法也可以按加法來處理

,即如果是補碼錶示的數,不管是加減法都直接用加法運算即可實現。

    2)兩個用補碼錶示的數相加時,如果最高位(符號位)有進位,則進位被捨棄

    這樣的運算有兩個好處:

    1)使符號位能與有效值部分一起參加運算,從而簡化運算規則。從而可以簡化運算器的結構,提高運算速度;(減法運算可以用加法運算表示出來。)

    2)加法運算比減法運算更易於實現。使減法運算轉換為加法運算,進一步簡化運算器線路設計

    下面深入分析上面所陳述的採用補碼的原因(目的)。

    用帶符號位的原碼進行乘除運算時結果正確,而在加減運算的時候就出現了問題,如下:假設字長為8bits

    1  D- 1 D = 1 D + ( -1 )D = ( 0 )D

    (00000001)原 + (10000001)原 = (10000010)原 = ( -2 ) 顯然不正確.。

    因為在兩個整數的加法運算中是沒有問題的,於是就發現問題出現在帶符號位的負數身上,對除符號位外的其餘各位逐位取反就產生了反碼。反碼的取值空間和原碼相同且一一對應。下面是反碼的減法運算:

      1  D- 1 D = 1 D + ( -1 )D = ( 0 )D

     (00000001) 反+ (11111110)反 = (11111111)反 = ( -0 ) 有問題。

      1  D - 2 D= 1 D+ ( -2 )D = ( -1 )D

     (00000001) 反+ (11111101)反 = (11111110)反 = ( -1 ) 正確

    問題出現在(+0)和(-0)上,在人們的計算概念中零是沒有正負之分的。

於是就引入了補碼概念。負數的補碼就是對反碼加一,而正數不變,正數的原碼反碼補碼是一樣的。在補碼中用(-128)代替了(-0),所以補碼的表示範圍為:

(-128~0~127)共256個。

    注意:(-128)沒有相對應的原碼和反碼, (-128) = (10000000) 補碼的加減運算如下:

    ( 1 ) 10- ( 1 ) 10= ( 1 )10 + ( -1 )10 = ( 0 )10

    (00000001)補 + (11111111)補 = (00000000)補 = ( 0 ) 正確

     ( 1 ) 10- ( 2) 10= ( 1 )10 + ( -2 )10 = ( -1 )10

    (00000001) 補+ (11111110) 補= (11111111)補 = ( -1 ) 正確

    採用補碼錶示還有另外一個原因,那就是為了防止0的機器數有兩個編碼。原碼和反碼錶示的0有兩種形式+0和-0,而我們知道,+0和-0是相同的。這 樣,8位的原碼和反碼錶示的整數的範圍就是-127~+127(11111111~01111111),而採用補碼錶示的時候,00000000是+0, 即0;10000000不再是-0,而是-128,這樣,補碼錶示的數的範圍就是-128~+127了,不但增加了一個數得表示範圍,而且還保證了0編碼 的唯一性。

接下來的問題是,如何能將減法運算轉換成加法運算呢?

    我們已經知道,原碼錶示簡單直觀,與真值轉換容易。但如果用原碼錶示,其符號位不能參加運算。在計算機中用原碼實現算術運算時,要取絕對值參加運算,符號位單獨處理,這對乘除運算是很容易實現的,但對加減運算是非常不方便的,如兩個異號數相加,實際是要做減法,而兩個異號數相減,實際是要做加法。在做減法時,還要判斷運算元絕對值的大小,這些都會使運算器的設計變得很複雜。而補碼這種編碼方式實際上正是針對上述問題的。通過用補碼進行表示,就可以把減法運算化為加法運算。

    在日常生活中,有許多化減為加的例子。例如,時鐘是逢12進位,12點也可看作0點。當將時針從10點調整到5點時有以下兩種方法:

    一種方法是時針逆時針方向撥5格,相當於做減法:

        10-5=5

    另一種方法是時針順時針方向撥7格,相當於做加法:

      10+7=12+5=5    (MOD 12)

    這是由於時鐘以12 為模,在這個前提下,當和超過12時,可將12捨去。於是,減5相當於加7。同理,減4可表示成加8,減3可表示成加9,…。

    在數學中,用“同餘”概念描述上述關係,即兩整數A、B用同一個正整數M (M稱為模)去除而餘數相等,則稱A、B對M同餘,記作:

       A=B     (MOD M)

    具有同餘關係的兩個數為互補關係,其中一個稱為另一個的補碼。當M=12時,-5和+7,-4和+8,-3和+9就是同餘的,它們互為補碼。

    從同餘的概念和上述時鐘的例子,不難得出結論:對於某一確定的模,用某數減去小於模的另一個數,總可以用加上“模減去該數絕對值的差”來代替。因此,在有模運算中,減法就可以化作加法來做。

    可以看出,補碼的加法運算所依據的基本關係為:

[x]補+ [y]補= [x+y]補

    補碼減法所依據的基本關係式:

[x-y]補 =[x+(-y)]補= [x]補+ [-y]補  

    至於加法運算為什麼比減法運算易於實現以及CPU如何實現各種算術運算等問題,則需要通過對數位電路的學習來理解CPU的運算器的硬體實現問題的相關內容了。

五.

1.一個二進位制數的補碼的補碼就是原碼!!!

比如:真值-3,原碼1000 0011,補碼1111 1101,

原碼1111 1101,補碼1000 0011。 

也可以從補碼的數學含義理解。

2.幾個特殊的補碼記憶:(一般是8位,不是8位和8的倍數位的,在實際應用中沒有意義,所以一般都是變換成成8位的二進位制數。因為實際應用中,一般都是補碼錶示,所以著重記憶補碼)

     0的補碼是0000 0000

    -1的補碼是1111 1111    -1的原碼是1000 0001

-128的補碼是1000 0000

+1的補碼是其原碼。

+1~+127的補碼都是原碼。補碼逐漸加一。

-1~-127的補碼都是其反碼加一。補碼逐漸加一。

雖然補碼的原碼是多少 不夠直觀,但是補碼反映出的負數的大小是直觀的,補碼大小順序和真值保持一致。

負數真值中,-1最大,-128最小,

負數補碼中,-1補碼是1111 1111,...,-127補碼是1000 0001,-128補碼是1000 0000,

在負數的補碼中,直觀上可以看出,-1的補碼是最大的:1111 1111, -128的補碼是最小的:1000 0000。

3.

80H的補碼是多少?

因為有補碼,所以是有符號數。80H即原碼1000 0000,即真值-0,所以80H的補碼是0000 0000。

 六.+128

8位二進位制數時,表示不下+128,16位二進位制數時可以表示。因為+128=0001 0000 0000

8位二進位制數的原碼範圍是-127~-0,+0,~127,反碼是-127~-0,+0~+127,補碼範圍是-128~0~+127。範圍都是256個整數。

不包括+128。-128也只在補碼錶示中有。-128的原碼和反碼在8位二進位制數時也都沒有,在16位及以上可以表示。

七.探究求補碼的最好的方法

-0的原碼是 1000 0000,反碼 1111 1111, 補碼 0000 0000,可以反碼加一,可以對-1求補操作。

-3的原碼是 1000 0011,反碼 1111 1100 ,補碼 1111 1101,可以反碼加一,可以對-3求補操作。

-128原碼是 沒有            反碼 沒有              補碼 1000 0000                      可以對-128求補操作。

由上面三個例子可以看出,求補碼的最快捷的方法,第一位不變什麼的 只適用於不是-1 -128的大部分數!

最統一的方法,應該是:

有反碼的,反碼加一(其中,符號位有進位的 捨棄符號位 只保留數值位。比如-0的補碼。更重要的是-0的補碼 是規定),或者求補操作。

沒有反碼的,求補操作。比如-128。

所以說,求補操作,才是對-128~+127唯一全部使用的求補碼的方法。

這樣也就解釋了,為什麼所有補碼都可以用補碼減法運算了,因為求補操作對所有真值都適用。

求補操作:就是求(負數的)補碼

求補操作:不管符號位(不是符號位保持不變!也不是第一位保持不變!就是隻用負數的絕對值,根本沒用到符號位),取負數(真值)的絕對值(即將負數的符號位變為0),對絕對值按位取反(可以認為絕對值是無符號數),然後加一。就得到了負數的補碼。

求補操作對於求-0,-128也都適用。

例子:求3CH-90H。分為有符號數和無符號數時。

           0011 1100             

       -  1001 0000

----------------------      

3CH 和90H 不是真值!只有十進位制是真值,而 十六進位制或者八進位制 都是為了書寫二進位制碼方便。所以才說3CH可能是無符號數 也可能是有符號數!

3CH 和90H 就是兩個二進位制碼!這兩個二進位制碼可能是無符號數或者有符號數!

二進位制碼(二進位制數)分為有符號數和無符號數。

有符號數時,X-Y=X+(-Y)補,所以,求-90H的補碼,即求-1001 0000的補碼。即對-1001 0000求補操作!不是對1001 0000求補操作!90H是絕對值,-90H是真值,1001 0000是絕對值的二進位制碼。

--------------------------

這裡解釋一下題目要求的意思:

(1)機器只認識二進位制。十六進位制和八進位制是為了人書寫簡潔而設立的。

(2)有符號數和無符號數說的都是二進位制數(二進位制碼)。

3CH的二進位制碼是唯一的,但是當它是有符號數時和是無符號數時 的真值顯然是不同的。