二進位制補碼

2021-06-10 03:18:23 字數 2787 閱讀 6160

計算機只能識別0和1,使用的是二進位制,而在日常生活中人們使用的是十進位制,"正如

亞里斯多德早就指出的那樣,今天十進位制的廣泛採用,只不過我們絕大多數人生來具有10個手指頭這個解剖學事實的結果.儘管在歷史上手指計數(5,10進製)的實踐要比二或三進製計數出現的晚."(摘自《數學發展史》有空大家可以看看哦~,很有意思的).為了能方便的與二進位制轉換,就使用了十六進製制(2 4)和八進位制1.數值有正負之分,計算機就用乙個數的最高位存放符號(0為正,1為負).這就是機器數的原碼了.

假設字長為8bits 要完成,1-1 =0

( 1 ) - ( 1 )

( 1 ) + ( -1 )

(00000001)+ (10000001) -----------------原碼計算

= (10000010)= ( -2 )

( 1 ) - ( 2 )

( 1 ) + ( -2 )

(00000001)+ (10000010) -----------------原碼計算

= (10000011)= ( -3 )

顯然結果不正確.

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

下面是反碼的減法運算:

(00000001)+ (11111110)----反碼計算

= (11111111)

= ( 10000000 )

=(-0)有問題

按上面同樣的方法計算1-2=-1

(00000001)+ (11111101)----反碼計算

= (11111110)

= ( 10000001 ) = (-1)正確

問題出現在(+0)和(-0)上,在人們的計算概念中零是沒有正負之分的.(印度人首先將零作為標記並放入運算之中,包含有零號的

印度數學和十進位制計數對人類文明的貢獻極大). 於是就引入了補碼概念.

負數的補碼就是對反碼加1,而正數不變,正數的原碼反碼補碼是一樣的.

·快速回顧

1.補碼的得來:是為了讓負數變成能夠加的正數,so,負數的補碼=模-負數的絕對值

比如:-1 補碼:1111 1111(10000 0000 -1得來)

當乙個數要減1的時候,可以直接加 1111 1111

2.原碼的得來:(負數的原碼,直接把對應正數的最高位改為1)

原碼能夠直觀的表示乙個負數(能直觀的把真值顯示出來,如 -1為1000 0001

其中最高位表示符號位,不進行算術計算)

3.原碼和補碼之間轉換:補碼= 反碼+1

4.現在來推-128

-128的補碼:10000 0000 - 1000 0000(+128沒有符號位)=1000 0000

反碼:1111 1111(1000 0000 -1=1000 0000+1111 1111=1111 1111)

原碼:1000 0000(反碼取反)

原碼 1000 0000 (-128,進製被捨去)

反碼 1111 1111

補碼 1000 0000(1111 1111(反碼) + 1=1000 0000,這裡實際上真正相加的是

1111 1111後面的7位,第1位是符號位始終不會變,

所以,當進到第8位的時候,就表示溢位了,會被捨棄)

5.0只有乙個補碼0000 0000(聽說可以證明的),如果是這樣,那麼1000 0000就不會表示成-0的補碼

即:補碼1000 0000唯一的表示-128

在補碼中用(-128)代替了(-0),所以補碼的表示範圍為: (-128~0~127)共256個.

注意:(-128)也有相對應的原碼和反碼, 它的反碼是(11111111)原碼仍然是(10000000)(-128)

補碼的加減運算如下:

下面是補碼的運算:

( 1 )- ( 1 )= ( 1 )+ ( -1 )

=(00000001)補+ (11111111)補((11111110)+1)(反碼加1)

= (00000000)補= ( 0 )正確

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

= (00000001)補+ (11111110)補

= (11111111)補= ( -1 ) 正確

(-1) = (10000001)原碼=(11111110 )反碼 =((11111110 )+ 1)補碼

所以補碼的設計目的是:

⑴使符號位能與有效值部分一起參加運算,從而簡化運算規則.

⑵使減法運算轉換為加法運算,進一步簡化計算機中運算器的線路設計 所有這些轉換都是在計算機的最底層進行的,而在我們使用的彙編、c等其他高階語言中使用的都是原碼。

·小數和分數的補碼

一、十進位制分數補碼可以先將分子和分母分別表示成二進位制數,然後計算出二進位制小數,再按下面第三步的方法將求出小數的補碼形式。

37/64=100101b/2^6=0.100101b

-51/128=110011b/2^7=0.0110011b

二、十進位制小數的補碼也應該先將其轉換成二進位制小數,再按下面第三步的方法將求出小數的補碼形式。

0.375=0.011b

0.5625=0.1001b

三、將二進位制小數對應的補碼求出

[37/64]補碼=[0.100101b]補碼=00100101b

[-51/128]補碼=[0.0110011b]補碼=11001101b

[0.375]補碼=[0.011b]補碼=00110000b

[0.5625]補碼=[0.1001b]補碼=01001000b

二進位制補碼

二進位制補碼 計算機儲存資料都是以0,1二進位制進行儲存。對於有符號整數儲存 對於浮點數待續 引入補碼概念。原碼即直接將真值轉換為其相應的二進位制形式,而反碼和補碼是對原碼進行某種轉換編碼方式。對於正整數,原碼,反碼和補碼都相一樣 對於負整數,補碼等於反碼加1,而反碼等於原碼除符號位不變其他位按位求...

二進位制補碼

二進位制補碼主要是為了解決負整數的加減法運算 減法轉化為加法 原碼表示法就是用二進位制的最高位表示符號,0表示正數,1表示負數。以8位為例 1就是表示為0000 0001,1表示為1000 0001.而補碼的規則是正整數保持不變,針對負整數,除符號位外,其他位全部取反,然後 1。注 負整數中,原碼轉...

二進位制補碼

在計算機系統中,數值一律用二進位制補碼進行表示,補碼的計算規則是 補碼 等於 原碼按位 取反 再 加 1。有符號型別的數值,最高位是符號位,1為負數,0為正數。按照補碼計算規則,可得 正數的補碼等於其原碼。如 char num num 1 如 1 的原碼是 0000 0001 補碼也是 0000 0...