1樓:沙里波特
正負數字,存放在計算機中,就稱為:補碼。
正數,就直接以二進位制存放。
負數,則需要變換一下,再存放。
如果,僅使用兩位十進位制數,就是 00~99,共有 100 個數字。
減一,就可以用 +99 代替:
28 - 1 = 27
28 + 99 = (1) 27
忽略進製,結果就是相同的。
於是,99,就是-1 的補數;
同理,98,就是-1 的補數;
利用【補數】,就可把「相減」運算,改為「相加」。
利用【補數】,就可把「負數」改為「正數」。
對於「-1」,其對應的【補數】就是:100-1 = 99。
計算機中,沒有數字。1 和 0,都是**。
八位二進位制**,稱為乙個位元組。
0000 0000~1111 1111,共有 256 個**。
-1,就可以用 256- 1 = 255 (=1111 1111) 代替,
-2,就可以用 256- 2 = 254 (=1111 1110) 代替,
那麼,1111 1111 就稱為-1 的補碼;
同理,1111 1110 也就是-2 的補碼。
計算機中,只有加法器,沒有減法器。
做減法運算,必須使用【補碼】,用加法來操作。
補碼的定義式,如下:
正數的補碼,就是該數字本身。
負數的補碼,就用「模」,加上該負數,即可。
求補碼,並不需要學習「原碼反碼符號位 」這些垃圾知識。
2樓:孟雨蘭
補碼補碼舉例 1、在計算機系統中,數值一律用補碼來表示(儲存)。
主要原因:使用補碼,可以將符號位和其它位統一處理;同時,減法也可按加法來處理。另外,兩個用補
碼表示的數相加時,如果最高位(符號位)有進製,則進製被捨棄。
2、補碼與原碼的轉換過程幾乎是相同的。
數值的補碼表示也分兩種情況:
(1)正數的補碼:與原碼相同。
例如,+9的補碼是00001001。
(2)負數的補碼:符號位為1,其餘位為該數絕對值的原碼按位取反;然後整個數加1。
例如,-7的補碼:因為是負數,則符號位為「1」,整個為10000111;其餘7位為-7的絕對值+7的原碼
0000111按位取反為1111000;再加1,所以-7的補碼是11111001。
已知乙個數的補碼,求原碼的操作分兩種情況:
(1)如果補碼的符號位為「0」,表示是乙個正數,所以補碼就是該數的原碼。
(2)如果補碼的符號位為「1」,表示是乙個負數,求原碼的操作可以是:符號位為1,其餘各位取
反,然後再整個數加1。
例如,已知乙個補碼為11111001,則原碼是10000111(-7):因為符號位為「1」,表示是乙個負
數,所以該位不變,仍為「1」;其餘7位1111001取反後為0000110;再加1,所以是10000111。
在「閒扯原碼、反碼、補碼」檔案中,沒有提到乙個很重要的概念「模」。我在這裡稍微介紹一下「模」
的概念:
「模」是指乙個計量系統的計數範圍。如時鐘等。計算機也可以看成乙個計量機器,它也有乙個計量範
圍,即都存在乙個「模」。例如:
時鐘的計量範圍是0~11,模=12。
表示n位的計算機計量範圍是0~2^(n)-1,模=2^(n)。
「模」實質上是計量器產生「溢位」的量,它的值在計量器上表示不出來,計量器上只能表示出模的
餘數。任何有模的計量器,均可化減法為加法運算。
例如: 假設當前時針指向10點,而準確時間是6點,調整時間可有以下兩種撥法:
一種是倒撥4小時,即:10-4=6
另一種是順撥8小時:10+8=12+6=6
在以12模的系統中,加8和減4效果是一樣的,因此凡是減4運算,都可以用加8來代替。
對「模」而言,8和4互為補數。實際上以12模的系統中,11和1,10和2,9和3,7和5,6和6都有這個特
性。共同的特點是兩者相加等於模。
對於計算機,其概念和方法完全一樣。n位計算機,設n=8, 所能表示的最大數是11111111,若再
加1稱為100000000(9位),但因只有8位,最高位1自然丟失。又回了00000000,所以8位二進位制系統的
模為2^8。 在這樣的系統中減法問題也可以化成加法問題,只需把減數用相應的補數表示就可以
了。把補數用到計算機對數的處理上,就是補碼。
另外兩個概念
一的補碼(one's complement) 指的是正數=原碼,負數=反碼
而二的補碼(two's complement) 指的就是通常所指的補碼。
這裡補充補碼的代數加減運算:
1、補碼加法
[x+y]補 = [x]補 + [y]補
x=+0110011,y=-0101001,求[x+y]補
[x]補=00110011 [y]補=11010111
[x+y]補 = [x]補 + [y]補 = 00110011+11010111=00001010
注:因為計算機中運算器的位長是固定的,上述運算中產生的最高位進製將丟掉,所以結果不是
100001010,而是00001010。
2、補碼減法
[x-y]補 = [x]補 - [y]補 = [x]補 + [-y]補
其中[-y]補稱為負補,求負補的方法是:對補碼的每一位(包括符號位)求反,最後末位加「1」。
這裡補充補碼的代數解釋:
任何乙個數都可以表示為-a=2^(n-1)-2^(n-1)-a;
這個假設a為正數,那麼-a就是負數。而根據二進位制轉十進位制數的方法,我們可以把a表示為:a=k0*2^0+k1*2^1+k2*2^2+……+k(n-2)*2^(n-2)
這裡k0,k1,k2,k(n-2)是1或者0,而且這裡設a的二進位制位數為n位,即其模為2^(n-1),而2^(n-1)其二項是:1+2^0+2^1+2^2+……+2^(n-2),而式子:-a=2^(n-1)-2^(n-1)-a中,2^(n-1)-a代入a=k0*2^0+k1*2^1+k2*2^2+……+k(n-2)*2^(n-2)和2^(n-1)=1+2^0+2^1+2^2+……+2^(n-2)兩式,2^(n-1)-a=(1-k(n-2))*2^(n-2)+(1-k(n-3))*2^(n-3)+……+(1-k2)*2^2+(1-k1)*2^1+(1-k0)*2^0+1,而這步轉化正是取反再加1的規則的代數原理所在。
因為這裡k0,k1,k2,k3……不是0就是1,所以1-k0,1-k1,1-k2的運算就是二進位制下的取反,而為什麼要加1,追溯起來就是2^(n-1)的二項式最後還有一項1的緣故。而-a=2^(n-1)-2^(n-1)-a中,還有-2^(n-1)這項未解釋,這項就是補碼裡首位的1,首位1在轉化為十進位制時要乘上2^(n-1),這正是n位二進位制的模。
不能貼公式,所以看起來很麻煩,如果寫成代數式子看起來是很方便的。
注:n位二進位制,最高位為符號位,因此表示的數值範圍-2^(n-1) ——2^(n-1) -1,所以模為2^(n-1)。上面提到的8位二進位製模為2^8是因為最高位非符號位,表示的數值範圍為0——2^8-1。
什麼叫做補碼?
3樓:
補碼是用來解決負數在計算機中的表示問題的。正數的補碼就是其本身;負數的補碼是在其原碼的基礎上, 符號位不變, 其餘各位取反, 最後+1. (即在反碼的基礎上+1)。
例:1-1 = 1+(-1) = 00000001(原碼) + 100000001(原碼) =00000001(反碼) +11111110(反碼) = 11111111(反碼)=10000000(原碼) = -0
用反碼運算時,結果為-0,雖然+0和-0都是0,但是看起來總是覺得怪怪的,何況0帶符號沒有任何意義,並且出現了兩個能表示0的二進位制數00000000和10000000。
這讓嚴謹的程式設計師們如何能接受,為了消除歧義,於是出現了反碼。
擴充套件資料
補碼這個編碼方案要解決的是如何在機器中表示負數,其本質意義為用乙個正數來表示這個正數對應的負數。所謂-20的補碼是指:如何在機器中用補碼形式表示-20。
具體過程是這樣的:將20的二進位制形式直接寫出00010100,然後所有位取反變成11101011,再加1變成了11101100。最簡單的補碼轉換方式,不必去理會轉換過程中的符號位,只關注轉換前和最終轉換後的符號位就行。
補碼的總前提是機器數,不要忘了機器數的符號位含義,最高位為0表示正數,最高位為1表示負數,而最高位是指機器字長的最左邊一位。位元組數100b,最高位為00000100中的最左邊的0。
4樓:沙里波特
補碼,應該是最容易理解的知識了。
小學生都可以自己摸索出來。
按照四位二進位制來說,共有 16 組**。
數字 0 的二進位制,就是 0000,
數字 1 的二進位制,就是 0001,
數字 7 的二進位制,就是 0111。
可見下表:
零和正數的補碼
負數怎麼辦?
就從 0000,依次向下減,就行了。那麼:
數字-1 的二進位制,就是 0000-1 = (1) 1111 = 15(十進位制)。
(括號中的 1,是借位,捨棄不要了。)
數字-2 的二進位制,就是 1111-1 = 1110 = 14。
數字-3 的二進位制,就是 1110-1 = 1101 = 13。
數字-8 的二進位制,就是 1000 = 8(十進位制)。
(別再減了。再減,就是 0111 = +7 了。)
可見下表:
負數的補碼
綜合到一起,就是-8~+7 的四位補碼。見下表:
四位補碼
總結:
零和正數的補碼,就是數字本身(也可轉為二進位制)。
負數的補碼,就是: 16+這個負數。
(如果是 8 位二進位制,就改用: 256 + 這個負數。)
整個推算過程,並不需要使用「原碼反碼符號位」這些垃圾。
計算時,使用十進位制,簡單方便。得出的補碼,當然也是十進位制。
如果需要二進位制,就變換一下。
補碼,很難嗎?
如果不涉及原碼反碼符號位,就一點也不難。
-----------
補碼有什麼用呢?
利用補碼,可以把減法運算,轉換成加法。
(所以,在計算機中,有乙個加法器,就夠用了。)
例如:6-2 = 4,用補碼運算如下:
6 的補碼是 0110、-2 的補碼是 1110。
0110 + 1110 = (1) 0100 (= 4 的補碼)
(括號中的 1,是進製,捨棄不要了。)
注意:
如果運算結果超出了-8~+7 的範圍,結果將是錯的。
這種現象稱為「溢位」。
再注意一下:進製,並不等於溢位。
---------
因為補碼的這個特性,所以,在計算機中,只是使用補碼存放資料。
而原碼反碼,在計算機中,都是不存在的。
原碼反碼的用途,只是用於「筆算」。
其實,筆算的方法,並非只有「取反加一」。
原碼反碼,只是磚家為了增加收入,瞎編的垃圾而已。
所以,大家,完全不必在原碼反碼 上浪費時間精力。
但是,考試怎麼辦?
呃 ...,千萬別跟老師較勁,他怎麼講,你就怎麼答吧。
什麼是補碼,如何轉換反碼 補碼 原碼?
原碼 補碼 反碼之間是怎樣轉換的?一 正整數的原碼 反碼 補碼完全一樣,即符號位固定為0,數值位相同。二 負整數的符號位固定為1,由原碼變為補碼時,規則如下 1 原碼符號位1不變,整數的每一位二進位制數字求反,得到反碼。2 反碼符號位1不變,反碼數值位最低位加1,得到補碼。方法 1 正整數的原碼,反...
原碼求補碼是卻加一為什麼補碼求原碼也是卻
按原碼變補碼的規則,補碼變原碼應該是 減1取反 可是對於二進位制,減1取反 和 取反加1 的效果是一樣的,所以補碼的補碼就是原碼 原碼 true form 是一種計算機中對數字的二進位制定點表示方法。原碼錶示法在數值前面增加了一位符號位 即最高位為符號位 正數該位為0,負數該位為1 0有兩種表示 0...
8的補碼是多少為什麼 1的反碼是
樓主你好,我們先來看看反碼的概念,簡單的說,正數的反碼與原始碼一致,負數的反碼符號位不變,其他位按位取反.0可以理解為正,也可以理解為負,所以有兩種表示.你說 1的反碼是 126,這是用8位2進製來表示乙個數.第一位表示符號位,1換算成2進製為10000001,根據反碼的規則,它的反碼為111111...