一句話帶你記住原碼 反碼 補碼關係,包含詳解

2021-10-07 14:35:29 字數 2774 閱讀 9215

據說由於減法硬體開銷太大被「say goodbye」了。所以減法就由加法但是加數是乙個負數代替。

0001+1001=1010 (1+(-1)=-2)懶得算原碼、反碼、補碼在下面詳解裡有**

但是顯然原碼滿足不了需要,於是人們發明了反碼,我們正數不變把負數各位取反(符號位不變)這樣相加必為1111即為-0。

0001+1110=1111(1+(-1)=-0)雖然是-0但也算是過關了

0001+1100=1101(1+(-3)=-2)完全正確

但是

0011+1110=0001(3+(-1)=1)比實際答案2少1

如果1111+0001變成正0豈不是更好

既然涉及到負數的結果少1我們就給負數反碼加1,於是補碼就誕生了,正數仍然不變把所有負數在反碼的基礎上+1。

0001+1111=0000(1+(-1)=0)完美,這樣1111就可以滾去表示-8了

0001+1101=1110(1+(-3)=-2)完美,這裡1110(-2補碼)=1101(-2反碼)+0001

0011+1111=0010(1+(-3)=2)也被完美解決了

這句話我說完了。

這tm是一句話?

不要打了,我還要給你們解釋呢!

講解前先看下原碼、反碼、補碼的基礎知識,已經知道的可以直接跳到四)模、同餘數

原碼:是最簡單的機器數表示法。用最高位表示符號位,『1』表示負號,『0』表示正號。其他位存放該數的二進位制的絕對值。

下圖給出部份正負數數的二進位制原碼表示法

反碼:正數的反碼還是等於原碼,負數的反碼就是他的原碼除符號位外,按位取反。

下圖給出部分正負數的二進位制數反碼表示法

補碼:正數的補碼等於他的原碼,負數的補碼等於反碼+1。

下圖給出帶符號位四位二進位制的補碼表示法

要想明白為什麼補碼可以完美解決問題需要先了解同餘數概念,這裡我們用常見的例子時鐘來解釋:

如果說現在時針現在停在10點鐘,那麼什麼時候時針會停在八點鐘呢?

很簡單,兩個小時之前,是八點鐘。未來過十個小時的時候也是八點鐘

也就是說時鐘正撥10小時,或是倒撥2小時都是八點鐘。

也就是10-2=8,而且 10+10=8(10+10=10+2+8= 12 +8=8)

所以12在時鐘運算中,稱之為模,超過了12就會重新從1開始算了。

也就是說, 10-2和10+10從另乙個角度來看是等效的,它都使時針指向了八點鐘。

既然是等效的,那在時鐘運算中,減去乙個數,其實就相當於加上另外乙個數(這個數與減數相加正好等於12,也稱為同餘數)

在這裡,我們再次強調原碼,反碼,補碼的引入是為了解決做減法的問題。在原碼,反碼表示法中,我們把減法化為加法的思維是減去乙個數,等於加上乙個數的相反數,結果發現引入了符號位,卻因為符號位造成了各種意向不到的問題。

但是從上面的例子中,我們可以看到其實減去乙個數,對於數值有限制,有溢位的運算(模運算)來說,其實也相當於加上這個數的同餘數。

在模運算中也就不再存在負數了,因為乙個負數加上模就變成了正數然而它的二進位制表示方式卻不變。

1111(-1)=-1+1*16(四位二進位制的模為2*2*2*2=16)=15

所以這裡的符號位只是人理解的符號位,實際上對於運算來說它就是數的一部分了,是不是符號位已經不影響運算了,不信可以自己試一試。

通過時鐘的例子我們知道了

|負數的絕對值| + 它的同餘數 = 模 ——1

乙個數 + 負數 = 乙個數 + 它的正同餘數 ——2

之前反碼的地方我們知道了

0001(1)+1110(-1的反碼)=1111(-0) ——4

根據模運算,我們把它理解成:

1為負數的絕對值 + (-1+1*16=15)負數的同餘數 (反碼)= 1111 = 模(10000)-1 ——3

我們把1、2、3三個式子聯立

根據2式:乙個數 + 負數 = 乙個數 + 它的正同餘數

根據1式:原式 = 乙個數 +(模 - 負數的絕對值)

根據3式:原式 = 乙個數 + [模 -(模 - 1 - 負數的同餘數(反碼))]=乙個數+(1+負數的同餘數(反碼))

根據3、4式我們知道負數的同餘數(反碼)就該負數的反碼

所以:原式 = 乙個數 +(1 + 該負數的反碼)

寫到這裡大家應該都明白了吧,負數的反碼 + 1不就是補碼嗎?

所以一切看似偶然的東西實際卻有著必然的道理。

mysql 匯出一句話 MySQL 匯出一句話

drop table if exists temp 如果存在temp就刪掉 create table temp cmd text not null 建立temp表,裡面就乙個cmd欄位 insert into temp cmd values php eval post cmd 把一句話木馬插入到te...

一句話提醒

1 在c 中,父窗體要訪問子窗體變數,需將子窗體變數設為public才能訪問。2 每 5 秒重新整理頁面 5 秒後重定向頁面 3 block 此元素將顯示為塊級元素,此元素前後會帶有換行符。inline 預設。此元素會被顯示為內聯元素,元素前後沒有換行符。4 document.getelementb...

一句話命令

bash 型別 wget r nc np 分片20m 上傳 bypy vvv s 20m upload mac下檢視埠占用 nettop nm tcp brew brew uninstall zsh brew services list brew services start brew servic...