源碼1反碼
Ⅰ 一文搞懂原碼、反碼、補碼
需要聲明的是,本文涉及到的數字及運算均基於 8位bit 下的值。
最高位為符號位,0代表正數,1代表負數,非符號位為該數字絕對值的二進製表示。
如:
127的原碼為0111 1111
-127的原碼為1111 1111
正數的反碼與原碼一致;
負數的反碼是對原碼按位取反,只是 最高位(符號位)不變 。
如:
127的反碼為0111 1111
-127的反碼為1000 0000
正數的補碼與原碼一致;
負數的補碼是該數的 反碼加1 。
如:
127的補碼為0111 1111
-127的補碼為1000 0001
總結一下就是:
下面就來探討一下,為啥要用補碼來表示數字。
如果計算機內部採用原碼來表示數,那麼在進行加法和減法運算的時候,需要轉化為兩個絕對值的加法和減法運算;
計算機既要實現加法器,又要實現減法器,代價有點大,那麼可不可以只用一種類型的運算器來實現加和減的遠算呢?
很容易想到的就是 化減為加 ,舉一個生活中的例子來說明這個問題:
時鍾一圈是360度,當然也存在365度,但其實它和5度是一樣的;
相同的道理,-30度表示逆時針旋轉30度,其與順時針旋轉330度是一樣的;
這里數字360表示時鍾的一圈,在計算機里類似的概念叫 模 ,它可以實現 化減為加 ,本質上是將 溢出的部分捨去 而不改變結果。
易得,單位元組(8位)運算的模為256=2^8。
在沒有符號位的情況下,127+2=129,即:
這時,我們將最高位作為符號位,計算機數字均以補碼來表示,則1000 0001的原碼為減1後按位取反得1111 1111,也就是-127。
也就是說,計算機里的129即表示-127,相當於模256為一圈,順時針的129則和逆時針127即-127是一樣的。
故可以得到以下結論:
負數的補碼為 模減去該數的絕對值 。
如-5的補碼為:
-5=256-5=251=1111 1011(二進制)
同樣的,臨界值-128也可以表示出來:
-128=256-128=128=1000 0000(二進制)
但是正128就會溢出了,故單位元組(8位)表示的數字范圍為-128--127。
最後,我們來看一下,補碼是如何通過模的 溢出舍棄 操作來完成 化減為加 的!
16-5=16+(-5)=11
1 0000 1011將溢出位捨去,得0000 1011(二進制)=11。
好的,本文分享就到這里,希望能夠幫助到大家。
Ⅱ 原碼,反碼,補碼和移碼: 原碼:1001101,反碼,補碼,移碼各是多少
解:首位數字表示正負不做變(1為負數,0為正數)
反碼:1110010(正數反碼等於原數,題中為負數,則除首位數對應取反)
補碼:1110011(得出反碼數基礎上末位加一)
移碼:0110011(補碼符號位第一位數字取反)
反碼是數值存儲的一種,多應用於系統環境設置,如linux平台的目錄和文件的默認許可權的設置umask,就是使用反碼原理。
補碼(2's complement)是一種用二進製表示有號數的方法,也是一種將數字的正負號變號的方式。
移碼(又叫增碼)是符號位取反的補碼,一般用指數的移碼減去1來做浮點數的階碼,引入的目的是為了保證浮點數的機器零為全0。
(2)源碼1反碼擴展閱讀
補碼的設計目的是:
1.使符號位能與有效值部分一起參加運算,從而簡化運算規則.
2.使減法運算轉換為加法運算,進一步簡化計算機中運算器的線路設計 所有這些轉換都是在計算機的最底層進行的,而在我們使用的匯編、C等其他高級語言中使用的都是原碼。
小數和分數的補碼:
1.十進制分數補碼可以先將分子和分母分別表示成二進制數,然後計算出二進制小數,再按下面第三步的方法將求出小數的補碼形式。
2.十進制小數的補碼也應該先將其轉換成二進制小數,再按下面第三步的方法將求出小數的補碼形式。
Ⅲ 請問-1的反碼是多少
正數的原碼反碼和補碼都是一樣的,就是本身 所以1的原碼是0,0000001 反碼是0,0000001 補碼是0,0000001 負數的反碼是原碼求反,補碼是反碼+1 所以-1的原碼是1,0000001 反碼是1,1111110 補碼是1,1111111 第一位是符號位
Ⅳ +0或者-0的源碼、反碼、補碼分別是什麼補碼是一樣的嗎
0原碼是00000000
-0原碼是10000000
0反碼是00000000
-0反碼是11111111
0補碼是00000000
補碼沒有正0與負0之分
正數的反碼、補碼和其原碼相同負數的反碼是其原碼除符號位外其他位取反負數的補碼是取其反碼後加1
Ⅳ 什麼是一個數的原碼,反碼,補碼
原碼,反碼,補碼針對的是定長二進制存儲器表示的有符號整數。
正數的原碼,反碼,補碼都相同。
負數的原碼最高位為1,其他位為整數的絕對值(零有+0、-0之分)。
負數的反碼最高位為1,其他位為整數的絕對值按位取反(零有+0、-0之分)。
負數的補碼最高位為1,其他位為整數的絕對值按位取反再加一(零沒有+0、-0之分,最常用)。
比如-1的原碼為0x80000001,反碼為0xFFFFFFFE,補碼為0xFFFFFFFF。
//---------
在計算絕對值、取反、加一的過程中,無論提升成多少位去計算,最後裝填時,都保留後幾位(符號位以外相應位數)。
Ⅵ 計算機的原碼,反碼,補碼是怎麼回事可以舉例說明嗎
原碼、反碼和補碼是計算機中對數字二進制的三種表示方法。
1、原碼
原碼(true form)是一種計算機中對數字的二進制定點表示方法。原碼表示法在數值前面增加了一位符號位(即最高位為符號位):正數該位為0,負數該位為1(0有兩種表示:+0和-0),其餘位表示數值的大小。
例如:用8位二進製表示一個數,+11的原碼為00001011,-11的原碼就是10001011。
2、反碼
反碼是數值存儲的一種,多應用於系統環境設置,如linux平台的目錄和文件的默認許可權的設置umask,就是使用反碼原理。反碼的表示方法是:正數的反碼與其原碼相同;負數的反碼是對正數逐位取反,符號位保持為1。
例如:
[+7]反= 0 0000111 B;
[-7]反= 1 1111000 B。
3、補碼
正數:正數的補碼和原碼相同。負數:負數的補碼則是符號位為「1」。並且,這個「1」既是符號位,也是數值位。數值部分按位取反後再在末位(最低位)加1。也就是「反碼+1」。
例如:
[+7]補= 0 0000111 B;
[-7]補= 1 1111001 B。
(6)源碼1反碼擴展閱讀
原碼、反碼、補碼的轉換方法如下:
(1) 已知原碼,求補碼。
例:已知某數X的原碼為10110100B,試求X的補碼和反碼。
首先通過原碼的首位確定該數字的正負,若為正數,反碼與原碼相同,補碼比原碼在末尾加1;若為負數,求其反碼時,符號位不變,數值部分按位求反;求其補碼時,再在其反碼的末位加1。
(2)已知補碼,求原碼。
按照求負數補碼的逆過程,數值部分應是最低位減1,然後取反。但是對二進制數來說,先減1後取反和先取反後加1得到的結果是一樣的,故仍可採用取反加1的方法。
Ⅶ 計算機源碼,反碼,補碼之間怎麼計算
轉換方法:
如果是正數或零,則首位為 0,補碼=原碼=反碼。
否則,首位為 1,數值位取反加一,即可實現「補碼與原碼」互換。
例如:
對 1111 1001 取反,為 1000 0110,再加一,得:1000 0111。
對 1000 0111 取反,為 1111 1000,再加一,得:1111 1001。
這說明,補碼 ←→ 原碼,方法是相同的。