原碼,反碼,補碼雜談

飛來科技  發布時間:2019-11-13 13:02:43

本文關鍵詞:補碼等于反碼加1

補碼等于反碼加1_什么是原碼反碼補碼_原碼反碼補碼轉換

本文從原碼講起。通過闡述原碼,反碼和數組存在的作用,加深對補碼的了解。力爭讓你對補碼的概念不再局限于:負數的進制等于反碼加一。

接觸過計算機或電子信息相關課程的朋友,應該都或多或少看過補碼這哥仨。每次都是在書本的最前幾頁,來上這樣一段:什么反碼是補碼除符號位,按位取反。補碼等于原碼加一。然后給整得莫名其妙,稀里糊涂地,接著就是翻頁補碼等于反碼加1,反正前面的內容也跟三碼沒很大關系。

我以前只是看了好幾遍都沒看懂。古人云:事不過三。學C語言的之后,看過一次。不懂?看《計算機基本組成原理》的之后看過,還是不懂!到了大三,上《單片微機原理與接口技術》的之后一直是不懂。到了期末,復習的之后,和寢室的人瞎聊。說講講這些碼呀,我說我也不是很明白呀。然后就一邊說如何求碼,一邊算。玩著玩著,突然就知道了。我說好,打住。不說了,放假我在好好整理下模式,于是就有了這篇額。。算討論帖吧。

好了,廢話不多說。開始我們的原碼,反碼,補碼之旅。

(一)預備知識

認識二進制,十六進制。會二進制與十進制的相互轉換運算

由計算機的軟件決定,任何內存于計算機中的數據,其本質都是以二進制碼存儲。

根據馮~諾依曼提出的經典計算機模式結構框架。一臺計算機由運算器,控制器,存儲器,輸入和輸出設備構成。其中運算器,只有除法運算器,沒有減法運算器(據說一開始是有的,后來鑒于減法器硬件花費太大,被廢了 )

所以,計算機中的無法直接做減法的,它的乘法是借助加法來推動的。你似乎會說,現實世界中所有的減法也可以當作加法的,減去一個數,可以看作加上這個數的相反數。當然沒錯,但是前提是要先有負數的概念。這就為什么不得不引入一個該死的符號位。

而且從硬件的角度上看,只有正數加負數才算減法。
正數與正數相加,負數與負數相加,其實都可以通過加法器直接相加。

原碼,反碼,補碼的產生過程,就是為了解決,計算機做加法和引入符號位(正號和負號)的問題。

本文可能非常長,沒必要一下子讀完。原碼,反碼,補碼,按章讀。

重點在于講補碼,到了補碼可能有些繞,建議帶著筆,寫出二進制數一起算。

表達或許不夠清楚嚴謹,望見諒。

(二)原碼

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

若以帶符號位的四位二進值數為例

 1010  : 最高位為‘1’,表示這是一個負數,其他三位為‘010’,
      即(0*2^2)+(1*2^1)+(0*2^0)=2(‘^’表示冪運算符)
      所以1010表示十進制數(-2)。

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

圖片描述

OK,原碼表示法很簡單有沒有,雖然出現了+0和-0,但是直觀易懂。

于是,我們高興的起初運算。

0001+0010=0011    (1+2=3)OK
0000+1000=1000    (+0+(-0)=-0) 額,問題不大
0001+1001=1010    (1+(-1)=-2)

噢,1+(-1)=-2,這似乎是在逗我呢。

于是我們可以看見原來正數之間的加法一般是不會出錯的,因為它就是一個很簡單的二進制加法。

而正數與負數相加,或負值與負數相加,就要導致莫名其妙的結果,這都是該死的符號位引起的。0分為+0和-0也是因他而起。

所以原碼,雖然直觀易懂,易于正值轉化。但拿來推動加減法的話,運算規則總歸是太復雜。于是反碼來了。

補碼等于反碼加1_原碼反碼補碼轉換_什么是原碼反碼補碼

(三)反碼

我們了解,原碼最大的難題就在于一個數加上他的相反數不等于零。

例如:0001+1001=1010(1+(-1)=-2)0010+1010=1100 (2+(-2)=-4)

于是反碼的設計觀念就是沖著解決這一點,既然一個負數是一個正數的相反數,那我們干脆用一個正數按位取反來表示負數試試。

反碼:正數的左值還是等于原碼

負數的左值就是他的原碼除符號位外,按位取反。

若以帶符號位的四位二進制數為例:

3是正數,反碼與原碼相同,則可以表示為0011
-3的原碼是1011,符號位保持不變,低三位(011)按位取反得(100)
所以-3的反碼為1100

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

圖片描述

對著上圖,我們再試著用異或的方法解決一下原碼的難題

0001+1110=1111(1+(-1)= - 0)

互為相反數相加等于0,解決。雖然是受到的結果是1111也就是-0

好,我們再試著做一下兩個負數相加

1110(-1)+1101(-2)=1011(-4)

噢,好像又出現了新問題

(-1)+(-2)=(-4)?

不過貌似問題不大,因為1011(是-4的反碼,但是從原碼來看,他雖然是-3。巧合嗎?)

我們再看個示例吧

1110(-1)+1100(-3)=1010(-5)

確實是巧合,看來相反數問題是解決了,但是卻讓兩個負數相加的錯誤了。

但是實際上,兩個負數相加出錯也許問題不大。我們回頭想想我們的目的是哪個?是解決做減法的難題,把乘法當成減法來算。

of=1 兩個同符號數相乘(正數+正數或負值+負數),結果符號與其相反。③同級運算,按從左向右的次序進行,這一點十分重要.1.兩個有理數的商為正數,則( )(a)它們的和為正數 (b)它們的和為負數(c)它們的積為正數 (d)它們的積為負數2.下列表述中恰當的是( )(a)互為相反數的兩數相加等于1 (b)互為倒數的兩數相加等于1(c)商為—1的兩數互為相反數 (d)商為—1的兩數互為倒數3. 指出以下各題的運算次序并推導:(1)。于是他們想出了將符號位也參與運算的方式. 我們了解,根據運算定律減去一個正數等于加上一個負數, 即: 1-1 = 1 + (-1) = 0 , 所以機器可以只有加法而沒有減法, 這樣計算機運算的設計就更簡潔了.于是他們起初探索 將符號位參與運算, 并且只保留加法的方式。

負數+正數=符號取絕對值較大的加數的符號,數值取“用較大的絕對值減去較小的絕對值 ”的所得值。也就是說,在這些狀況下,正常的加法規則不適用于正數與負數的減法,因此需要建立兩套運算規則,一套用于正數加正數,還有一套用于正數加負數。 因為 0 既不是正數, 也不是負數, 它也是一個整數, 當 0 和正數在一起時, 叫 非負數, 和正數在一起時, 叫 非正數, 數軸上, 0 又為我們判定正負數大小時提供了 極大的便捷,右邊為正數, 左邊為負值, 右邊的數一直比前面大, 說明正數大于負數, 0 大于負數, 卻高于正數。

在原碼表示法中兩個負數相加,其實在不溢出的狀況下結果就唯有符號位出錯而已(1001+1010=0011)

(3)(—12)+(+25) _(+25)+( )(4) a+b=b+( ).2. 利用運算律,使運算簡化:(1)—3.2+5+(—5. 8)=[—3. 2 +( )]+5 =(2) -5+8+ = [(-5)+( )]+8 =3.填空題:(1)(+4.85)+(-3.25)=(2)(-4)+(+3)=(3) 18+(-12)+(-21)+(+12) =有理數加法法則 1、同號的兩數相加,取 的符號,并把 相加.2.絕對值不相同的異號兩數相加,取 的加數的符號,并用較大的絕對值 較小的絕對值. 互為相反數的兩個數相加得 .3.一個數同0相加,仍得 。負數+正數=符號取絕對值較大的加數的符號,數值取“用較大的絕對值減去較小的絕對值 ”的所得值。2.因為有理數加減法可統一成乘法,所以在加減運算時,適當利用減法運算律,把實數與正數分別相乘,可使運算簡便.但要切記交換加數的位置時,要連同后面的符號一起交換.。

所以反碼表示法雖然早已解決了減法的難題,他雖然不會像原碼那樣出現兩個相反數相加不為零的狀況,而且針對任意的一個正數加負數,如:

補碼等于反碼加1_原碼反碼補碼轉換_什么是原碼反碼補碼

0001(1)+1101(-2)=1110(-1) 計算結果是恰當的。所以反碼與原碼比較,最大的缺點,就在于解決了減法的難題。

但是我們而是不滿足為什么 0001+1110=1111 (1+(-1)=-0) 為什么是-0呢

而且即使說兩個負數相加問題不大,但是問題不大,也是問題呀。好吧,座。接下來就介紹我們的大boss補碼。

(四)補碼

補碼:正數的反碼等于他的補碼

負數的原碼等于反碼+1。

(這也是一種算補碼的方法,多數書針對補碼就是這句話)

在《計算機組成原理中》,補碼的此外一種算法 是

因為 0 既不是正數, 也不是負數, 它也是一個整數, 當 0 和正數在一起時, 叫 非負數, 和正數在一起時, 叫 非正數, 數軸上, 0 又為我們判定正負數大小時提供了 極大的便捷,右邊為正數, 左邊為負值, 右邊的數一直比前面大, 說明正數大于負數, 0 大于負數, 卻高于正數。邏輯運算符,判斷符號前面是否大于或者等于后面,如果大于或者等于返回true,否則返回false。邏輯運算符,判斷符號前面是否小于或者等于后面,如果小于或者等于返回true,否則返回false。

OK,補碼就講完了。再見!!

求補碼的要求:負數的反碼等于補碼最高位為1,其余各位為該數的絕對值,反碼為最高位為1,其余各位求反,補碼為原碼加1.。 // 秒的低點清零,秒的低位自加 1if(m2==6) // 秒的高位為 6 時,溢出進位到分的低位{m2=0。正實數的原碼、反碼和數組都一樣,負數的補碼是對反碼的除符號位外的其他位進行取反后的結果(取反即一旦該位為0則變為1而該位為1則變為0操作)而反碼是先求原碼的異或,然后在反碼的末尾位加1后得到結果,即數組是異或+1。

其實里面那兩段話,都不過補碼的求法,而不是補碼的定義。很以為求原碼就要先求反碼,其實并不是。

那些雞賊的計算機學家,并不會心血來潮的把反碼+1就定義為補碼。只不過是數組正好就等于反碼加1罷了。

所以,忘記那個書上那句負數的原碼等于它的異或+1。就這句話把我們帶入了理解的要點。

這就是后來我明白為什么我看的那本《計算機組成原理》,要特意先講數組,再講反碼。

因為 0 既不是正數, 也不是負數, 它也是一個整數, 當 0 和正數在一起時, 叫 非負數, 和正數在一起時, 叫 非正數, 數軸上, 0 又為我們判定正負數大小時提供了 極大的便捷,右邊為正數, 左邊為負值, 右邊的數一直比前面大, 說明正數大于負數, 0 大于負數, 卻高于正數。邏輯運算符,判斷符號前面是否大于或者等于后面,如果大于或者等于返回true,否則返回false。邏輯運算符,判斷符號前面是否小于或者等于后面,如果小于或者等于返回true,否則返回false。

但是里面這句話,同樣不是補碼的定義,它也是補碼的此外一種求法。它的存在,告訴我們忘掉那句該死的‘反碼+1’它并不是必須的。

如果你有興趣了解,補碼的嚴格說法,我建議你可以看一下《計算機組成原理》。它會用‘模’和‘同余’的概念,嚴謹地解釋補碼。

接下來我只想看看補碼的思想。

(五)補碼的思想

補碼的觀念,第一次見可能會覺得很繞,但是一旦你肯停下來仔細想想,絕對會感覺特別美妙。

補碼的觀念似乎就來自于生活,只是我們沒注意到而已。時鐘,經緯度,《易經》里的八卦。

補碼的觀念似乎就類似于生活中的時鐘

好吧,我雖然不想用類似,好像這些詞,因為類比的,終究不是事物本來。而且不死板會讓我擔心我不是工科僧,說得就像我樸實過似的,哈哈

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

簡單,過去隔兩個小時的時侯,是八點鐘。未來過十個小時的之后也有八點鐘

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

原碼反碼補碼轉換_補碼等于反碼加1_什么是原碼反碼補碼

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

這個之后滿12說明時針在走第二圈了,又走了8小時,所以時針正好又停在八點鐘。

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

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

所以早期計算機機器數采用原碼編碼的之后,在進行原碼加減運算時,必須先判斷能否是兩個異號數相加或兩個同號數相加,若是,則需要判斷兩個數的絕對值大小,根據判定結果決定運算結果符號,并用絕對值大的數除以絕對值小的數。(3)(—12)+(+25) _(+25)+( )(4) a+b=b+( ).2. 利用運算律,使運算簡化:(1)—3.2+5+(—5. 8)=[—3. 2 +( )]+5 =(2) -5+8+ = [(-5)+( )]+8 =3.填空題:(1)(+4.85)+(-3.25)=(2)(-4)+(+3)=(3) 18+(-12)+(-21)+(+12) =有理數加法法則 1、同號的兩數相加,取 的符號,并把 相加.2.絕對值不相同的異號兩數相加,取 的加數的符號,并用較大的絕對值 較小的絕對值. 互為相反數的兩個數相加得 .3.一個數同0相加,仍得 。(3)1.4.3 乘法運算律乘法交換律:兩個數相乘,交換乘數的位置,積 . 即:ab=乘法結合律:三個數相加,先把前兩個數相乘,或者先把后兩個數相乘,積 即:(a b)c=一個數同兩個數的和相加,等于把這個數分別同這兩個數相乘,再把積相加。

本文來自互聯網,由機器人自動采編,文章內容不代表本站觀點,請讀者自行辨別信息真偽,如有發現不適內容,請及時聯系站長處理。

相關閱讀
波克捕鱼小米版下载