二進制的原碼、反碼和補碼

本文內容約 1600 字,本文最早在公衆號:善始者實繁克終者蓋寡 中發出。html

目錄

  • 反碼
  • 補碼
    • 從新回來
    • 如何獲得補碼?
    • 補碼轉爲十進制
    • 補碼系統的數字表示方式
    • 補碼系統的用處
    • 補碼的原理
  • 參考內容

從新回來

目前是一名在校的大一學生,有時想寫些內容出來,但苦於腦子裏沒東西。提筆又落筆,遲遲沒有內容產出。想起以前我還在這個公衆號裏立下說:天天一篇文章。誒,又擡頭看了看這個公衆號的名字,誒。前端

接下來,打算重拾公衆號,嘗試輸出內容。另外,公衆號的介紹也修改了:程序員

前端初學者、設計門外人,一切纔剛剛開始…網絡

通過一段時間的思考和了解後,我把本身定位爲**「全棧偏前端軟件工程師」**,可是畢竟這條路沒有走過,具體能走到哪一步,將來具體如何不是很清晰。不過如今先踏踏實實從前端入手,一點點搭建本身的神經網絡。設計

本篇內容講一講計算機的一些基礎:3d

反碼

簡單說:日誌

  • 正數的反碼等於其原碼。
  • 負數的反碼,是保留其符號位後,其他各位原碼的數值取反的結果,也就是 0 變爲 1,1 變爲 0。

補碼

在計算機系統中,數值一概使用補碼來表示和存儲。cdn

一、如何獲得補碼?

簡單說就是把原二進制碼,先按位取反(0 變 1,1 變 0)後,再加 1。htm

下面用「有符號 4 位二進制」來舉個例子:blog

二進制到補碼.png

最後的結果能夠看到,這個數字的最高位爲 1,確實是負數。一個正數的補碼也就是相對應的負數。要是咱們反過來運算:

補碼到二進制.png

也就是一個負數的補碼就是其對應的正數

補碼轉爲二進制原碼,也能夠先減 1,再取反。

簡單總結爲:a 的補碼就是 -a (a 能夠是正負數)

不過有兩個數的補碼等於自己:一個是 0,另外一個是該「有符號位的二進制」所能表示的最大負數(100……)

二、補碼轉爲十進制

直接舉例說明:

補碼轉十進制.png

補碼轉十進制的規則,也就是除了「最高位」外,「其餘位」對應數字的處理和通常二進制相同。若是「最高位」爲 1,那麼它表示的數字爲 -2^(n−1),n 表明位數,最終將各個結果相加就是十進制數了。

三、補碼系統的數字表示方式

上面舉例介紹瞭如何獲得補碼。如今來講說「補碼系統」中的數字是如何表示的:

  • 正數0:補碼數字與二進制同樣,同時最高位的爲 0。
    • 因此 4 位的最大補碼正數爲 0111(7)
  • 負數:獲得補碼的步驟上文提過了,這個數字的最高位爲 1。
    • 因此 4 位的最小補碼負數爲 1000(-8)

那麼補碼數字所能表達的數字範圍爲:

最大最小.png

好比 8 位的補碼數字,能夠表示範圍爲:-128~127。

爲何最大值要減去一個 1?有符號位的 n 位二進制能夠用來表示兩組數,一組是大於等於 0,另外一組小於 0。

由於 0 的存在,因此須要減去一個 1。

四、補碼系統的用處

不是說計算機是用二進制的嗎?幹嗎要搞一個「補碼系統」?

補碼系統的最大優勢是能夠在處理加減乘除法只用一種加法電路

咱們先來試試用反碼來計算減法:

反碼減法.png

答案正確啊。那咱們繼續看看反碼特殊狀況

反碼減法二.png

這就出現問題了,出現了 -0 這種狀況。雖然說 -0 和 +0 應該都是 0。可是 0 帶着符號是沒有任何意義。

解決這個問題,就須要補碼了:

補碼減法.png

正好能夠計算出 -1 這個答案。

這裏沒有演示原碼的減法,你不如動手去試試。

五、補碼的原理

維基百科中是這樣說的:

指定 n 位長,那麼就有 2^n 個可能的值,加減法運算都存在上溢出下溢出的狀況,實際上都等價於**「模 2^n」**的加減法運算。這對於 n 比特無符號整數類型或是 n 比特有符號整數類型都一樣適用。

嗯。

看了一堆寫原理資料,仍是沒怎麼搞懂,總之原理和餘數的思想有關。

因此我如今所處的階段是:知其然,「知其因此然」得還不怎麼透徹。

可是我仍是要講一講。

看了阮一峯的網絡日誌《關於2的補碼》這一篇文章後,以爲文章中的解釋仍是十分清晰的。那我就用幾張圖來講明一下。在一個 4 位的二進制中,進行 5 - 6 的運算,咱們能夠把 5 - 6 轉化爲 5 + (-6)

5 + (-6).png

咱們已經分別知道 5 和 6 的原碼,要獲得 -6 咱們能夠用 0 - 6 獲得 -6 的二進制碼:

0-6.png

可是 0 根本不夠減啊。那咱們想一想,在作十進制減法的時候,要是這一位不夠減,怎麼辦,答案是問上一位借一個 1。那 0000 去借一位 變爲 1 0000

1000-0110.png

咱們又注意到,1 0000 實際上是能夠用 1111+ 1 來表示的,那把算式變爲:

補碼原理最後一步.png

第一步操做就至關因而按位取反,第二步再 +1,這個過程和獲得反碼的步驟徹底一致。

參考內容

相關文章
相關標籤/搜索