計算機只能識別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...