1. 程式人生 > >【轉載】對於補碼的理解

【轉載】對於補碼的理解

轉載一個部落格文章,對於補碼理解很深

轉載一篇文章,留下來學習,加深下印象。

問:

負數在計算機中如何表示?

舉例來說,+8在計算機中表示為二進位制的1000,那麼-8怎麼表示呢?

很容易想到,可以將一個二進位制位(bit)專門規定為符號位,它等於0時就表示正數,等於1時就表示負數。比如,在8位機中,規定每個位元組的最高位為符號位。那麼,+8就是00001000,而-8則是10001000。

但是,隨便找一本《計算機原理》,都會告訴你,實際上,計算機內部採用2的補碼(Two’s Complement)表示負數。

什麼是2的補碼?

它是一種數值的轉換方法,要分二步完成:

第一步,每一個二進位制位都取相反值,0變成1,1變成0。比如,00001000的相反值就是11110111。

第二步,將上一步得到的值加1。11110111就變成11111000。

所以,00001000的2的補碼就是11111000。也就是說,-8在計算機(8位機)中就是用11111000表示。

不知道你怎麼看,反正我覺得很奇怪,為什麼要採用這麼麻煩的方式表示負數,更直覺的方式難道不好嗎?

昨天,我在一本書裡又看到了這個問題,然後就花了一點時間到網上找資料,現在總算徹底搞明白了。

2的補碼的好處

首先,要明確一點。計算機內部用什麼方式表示負數,其實是無所謂的。只要能夠保持一一對應的關係,就可以用任意方式表示負數。所以,既然可以任意選擇,那麼理應選擇一種最方便的方式。

2的補碼就是最方便的方式。它的便利體現在,所有的加法運算可以使用同一種電路完成。

還是以-8作為例子。

假定有兩種表示方法。一種是直覺表示法,即10001000;另一種是2的補碼錶示法,即11111000。請問哪一種表示法在加法運算中更方便?

隨便寫一個計算式,16 + (-8) = ?

16的二進位制表示是 00010000,所以用直覺表示法,加法就要寫成:

 00010000
+10001000
---------
 10011000

可以看到,如果按照正常的加法規則,就會得到10011000的結果,轉成十進位制就是-24。顯然,這是錯誤的答案。也就是說,在這種情況下,正常的加法規則不適用於正數與負數的加法,因此必須制定兩套運算規則,一套用於正數加正數,還有一套用於正數加負數。從電路上說,就是必須為加法運算做兩種電路。

現在,再來看2的補碼錶示法。

 00010000
+11111000
---------
100001000

可以看到,按照正常的加法規則,得到的結果是100001000。注意,這是一個9位的二進位制數。我們已經假定這是一臺8位機,因此最高的第9位是一個溢位位,會被自動捨去。所以,結果就變成了00001000,轉成十進位制正好是8,也就是16 + (-8) 的正確答案。這說明了,2的補碼錶示法可以將加法運算規則,擴充套件到整個整數集,從而用一套電路就可以實現全部整數的加法。

2的補碼的本質

在回答2的補碼為什麼能正確實現加法運算之前,我們先看看它的本質,也就是那兩個步驟的轉換方法是怎麼來的。

要將正數轉成對應的負數,其實只要用0減去這個數就可以了。比如,-8其實就是0-8。

已知8的二進位制是00001000,-8就可以用下面的式子求出:

 00000000
-00001000
---------

因為00000000(被減數)小於0000100(減數),所以不夠減。請回憶一下小學算術,如果被減數的某一位小於減數,我們怎麼辦?很簡單,問上一位借1就可以了。

所以,0000000也問上一位借了1,也就是說,被減數其實是100000000,算式也就改寫成:

100000000
-00001000
---------
 11111000

進一步觀察,可以發現100000000 = 11111111 + 1,所以上面的式子可以拆成兩個:

 11111111
-00001000
---------
 11110111
+00000001
---------
 11111000

2的補碼的兩個轉換步驟就是這麼來的。

為什麼正數加法適用於2的補碼?

實際上,我們要證明的是,X-Y或X+(-Y)可以用X加上Y的2的補碼完成。

Y的2的補碼等於(11111111-Y)+1。所以,X加上Y的2的補碼,就等於:

X + (11111111-Y) + 1

我們假定這個算式的結果等於Z,即 Z = X + (11111111-Y) + 1

接下來,分成兩種情況討論。

第一種情況,如果X小於Y,那麼Z是一個負數。這時,我們就對Z採用2的補碼的逆運算,求出它對應的正數絕對值,再在前面加上負號就行了。所以,

Z = -[11111111-(Z-1)] = -[11111111-(X + (11111111-Y) + 1-1)] = X - Y

第二種情況,如果X大於Y,這意味著Z肯定大於11111111,但是我們規定了這是8位機,最高的第9位是溢位位,必須被捨去,這相當於減去100000000。所以,

Z = Z - 100000000 = X + (11111111-Y) + 1 - 100000000 = X - Y

這就證明了,在正常的加法規則下,可以利用2的補碼得到正數與負數相加的正確結果。換言之,計算機只要部署加法電路和補碼電路,就可以完成所有整數的加法。

轉自

另記載下反碼的規律

~ (反碼): 01001 ~ 後 10110,即1變0 , 0變1
6反碼結果是-7, 整數a的反碼結果= -a -1
(~6) = -7
-6 = -7 + 1;
(~8) = -9:-8 = -9 + 1;
(~16) = -17:-16 = -17 + 1;

~(-6)= -(-6)-1=5 ;
(~a)先把a變為-a,-a - 1 = (~a);

相關推薦

轉載對於補碼理解

轉載一個部落格文章,對於補碼理解很深 轉載一篇文章,留下來學習,加深下印象。 問: 負數在計算機中如何表示? 舉例來說,+8在計算機中表示為二進位制的1000,那麼-8怎麼表示呢? 很容易想到,可以將一個二進位制位(bit)專門規定為符號位,它等於0時

轉載Folyd演算法理解

一篇非常優秀的解析 傳送門 floyd演算法:我們真的明白floyd嗎? 2016年08月02日 20:14:18 ljhandlwt 閱讀數:7444 標籤: floyd 演算法 更多 個人分類: 演算法  

轉載Linux的inode的理解

sector 位置 數據區 特殊字符 重啟 獲取 ren 數據 組成 本文轉在是博主為了以後溫習。請訪問原文鏈接 http://www.cnblogs.com/itech/archive/2012/05/15/2502284.html 一、inode是什麽? 理解inode

轉載Spark學習——spark中的幾個概念的理解及參數配置

program submit man 聯眾 tail 進行 orb 數據源 work 首先是一張Spark的部署圖: 節點類型有: 1. master 節點: 常駐master進程,負責管理全部worker節點。2. worker 節點: 常駐worker進程,負責管理

轉載“菜”鳥理解.NET Framework(CLI,CLS,CTS,CLR,FCL,BCL)

ado 編寫 初學 運行 我不 簡單 ati compiler 菜譜  既然要學.NET,就要先認識認識她,我不喜歡大段大段文字的東西,自己通過理解,畫個圖,來看看.NET的沈魚落雁,閉月羞花之容。   最下層藍色部分是.NET Framework的基礎,也是所有應用軟件

轉載hashCode()、equals()以及compareTo()方法的理解

進行 一個 terms 兩個 定義 == bject str rac 判斷兩個對象是否相等(是同一個對象),首先調用hashCode()方法得到各自的hashcode, 1、如果hashcode不相等,則表明兩個對象不相等。 2、如果hashcode相等,繼續調用equal

轉載關於java 的InputStream和OutputStream的理解

class n) sep ring inpu 寫入 clas close ava 關於InputStream和OutputStream的輸入輸出方向的理解 InputStream輸入類,首先需要讀取的內容轉化成輸入流,再從它那裏進行讀取,先關聯源;之後過程中關聯目的,這樣形

轉載Python 中的 if __name__ == '__main__' 該如何理解

一個 知識 如果 協程 運行 pat 執行 開始 參考資料 轉自 曠世的憂傷 http://blog.konghy.cn/2017/04/24/python-entry-program/ 程序入口 對於很多編程語言來說,程序都必須要有一個入口,比如 C,C++,以及完全面向

深入理解HTTP轉載

出處:深入理解HTTP—Joanna.Yan 先看一個簡單的http請求和響應: 1.HTTP協議是什麼**?** 我們瀏覽的每一個網頁都是基於HTTP協議呈現的,HTTP協議是網際網路應用中,客戶端(瀏覽器) 與伺服器之間進行資料通訊的一種協議。

轉載關於C#中Thread.Join()的一點理解

今天是第一次在C#中接觸Thread,自己研究了一下其中Thread.Join()這個方法,下面談談自己的理解。 Thread.Join()在MSDN中的解釋很模糊:Blocks the calling thread until a thread terminates 有兩個主

轉載深入理解 GRE tunnel

我以前寫過一篇 介紹 tunnel 的文章 ,只是做了大體的介紹。裡面多數 tunnel 是很容易理解的,因為它們多是一對一的,換句話說,是直接從一端到另一端。比如 IPv6 over IPv4 的 tunnel,也就是 SIT,它的原理如下圖所示:

理解MySQL--索引與優化轉載

      注:很好的兩篇文章,原文地址:           第一篇.http://feiyan.info/16.html   &

Java基礎:深入理解java異常處理機制的原理和開發應用轉載

Java異常處理機制在日常開發中應用頻繁,本篇文章主要在基礎的使用方法上,更進一步的,如何更加合理的使用異常機制,希望可以對各位朋友能有所幫助。   Java異常處理機制其最主要的幾個關鍵字:try、catch、finally、throw、throws,以及各種各樣

轉載支援向量機通俗導論(理解SVM的三層境界)

前言第一層、瞭解SVM  1.0、什麼是支援向量機SVM  1.1、線性分類  1.2、線性分類的一個例子  1.3、函式間隔Functional margin與幾何間隔Geometrical margin    1.3.1、函式間隔Functional margin    1.3.2、點到超平面的距離定

轉載 深入理解WeakHashmap

轉載出處 WeakHashmap (一) 檢視API文件,WeakHashmap要點如下: 以弱鍵 實現的基於雜湊表的 Map。在 WeakHashMap 中,當某個鍵不再正常使用時,將自動移除其條目。更精確地說,對於一個給定的鍵,其對映的存在並不阻止垃

轉載理解用戶模式和內核模式(譯)

manager new load 導致 針對 兩種 upload 底層 ref 理解用戶模式和內核模式(譯) ###理解用戶模式和內核模式 本文出處: http://blog.codinghorror.com/understanding-user-and-kernel-

轉載理解VB中選擇語句Select Case結構的最好例子

1.Select Case結構格式:       Select Case e         Case  e1               A組語句         Case  e2              B組語句         ……         Case  Else             n組

linux對於檔案許可權的理解

本篇博文旨在介紹linux下的許可權問題;介紹了Linux下,檢視許可權、修改許可權等方法;並通過分別在超級使用者(root)和普通使用者下進行測試,探索不同等級的使用者進入目錄需要的許可權,以及進入

轉載關於shutdown halt reboot poweroff init 0幾種關機和重啟命令的理解

shutdown 先執行關閉程序,寫入磁碟等一系列操作後 init 0關機 init 6 重啟halt 沒有在init 0 ,init 6執行級別時,呼叫shutdown(相當於shutdown -h now)reboot 沒有在init 0 ,init 6執行級別時,