自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

漫話:為什么計(jì)算機(jī)用補(bǔ)碼存儲數(shù)據(jù)?

存儲 存儲軟件
我們知道,計(jì)算機(jī)只認(rèn)識0和1[為什么計(jì)算機(jī)只認(rèn)識0和1],現(xiàn)實(shí)世界中的內(nèi)容,無論是文字、音頻、視頻等等想要通過計(jì)算機(jī)存儲、計(jì)算或者展示,都需要轉(zhuǎn)換二進(jìn)制。

 [[340031]]

 

我們知道,計(jì)算機(jī)只認(rèn)識0和1[為什么計(jì)算機(jī)只認(rèn)識0和1],現(xiàn)實(shí)世界中的內(nèi)容,無論是文字、音頻、視頻等等想要通過計(jì)算機(jī)存儲、計(jì)算或者展示,都需要轉(zhuǎn)換二進(jìn)制。

就像你剛剛唱的旋律,想要存儲在計(jì)算機(jī)中也是要轉(zhuǎn)成二進(jìn)制的。

那么,最簡單的一個(gè)數(shù)字,想要在計(jì)算機(jī)中表示出來,就需要通過一定的手段將他轉(zhuǎn)換成二進(jìn)制。而這種手段我們稱之為編碼方式。

 

原碼

相信很多人在上初中的時(shí)候都學(xué)過很多方式把一個(gè)十進(jìn)制數(shù)轉(zhuǎn)成二進(jìn)制數(shù),比如我們可以很快速的知道10的二進(jìn)制可以表示成 1010 。

但是初中老師沒有告訴我們的是:-10 如何表示呢?

為了在計(jì)算機(jī)中想辦法表示負(fù)數(shù)。于是人們想出來一種辦法:

在二進(jìn)制數(shù)值前面增加一位符號位(即最高位為符號位):正數(shù)該位為0,負(fù)數(shù)該位為1,其余位表示數(shù)值的大小。

這樣,如果我們想要10的話,那么就應(yīng)該是:0 1010,想要表示-10的話,就應(yīng)該是1 1010。

這種編碼方式被稱之為原碼,原碼的優(yōu)點(diǎn)比較明顯,那就是非常的簡單直觀,很容易被人理解。

 

使用原碼,解決了十進(jìn)制在計(jì)算機(jī)中的存儲問題,但是計(jì)算機(jī)中還有一個(gè)重要的操作那就是計(jì)算。使用原碼如何計(jì)算呢?

首先,原碼對于加法的運(yùn)算是沒什么問題的,如5 + 2 :

 

對應(yīng)的二進(jìn)制運(yùn)算:0 0101(原) + 0 0010(原) = 0 0111(原) 其對應(yīng)的十進(jìn)制是 7。

加法沒什么問題,那么我們再試著用原碼來計(jì)算減法,例如我們想要計(jì)算10 - 2:

 

那么就是 0 1010(原) - 0 0010(原) = 0 1000(原),那么這個(gè)二進(jìn)制對應(yīng)的十進(jìn)制剛好是8??梢娫a計(jì)算減法沒有問題的?

但是,以上運(yùn)算只是我們一廂情愿的算法,其實(shí)計(jì)算機(jī)算術(shù)邏輯單元(ALU)并沒有直接進(jìn)行減法運(yùn)算,對于減法,其實(shí)也是用加法器來實(shí)現(xiàn)的。

也就是說,計(jì)算機(jī)中的所有的減法運(yùn)算都需要轉(zhuǎn)換成加法運(yùn)算,那么10 - 2其實(shí)就是10 + (-2):

 

他們的二進(jìn)制 0 1010(原) + 1 0010(原) = 1 1100(原) ,得到的結(jié)果考慮他的符號位的話,這個(gè)值是-12,這明顯是錯(cuò)誤的!!!

可見,原碼雖然對于人類來說是比較簡單直觀的,但是對于計(jì)算機(jī)來說卻帶來了很大的計(jì)算難度。

 

反碼

因?yàn)樵a雖然容易被人理解,但是給計(jì)算機(jī)的計(jì)算帶來了一定的困難,尤其是減法的運(yùn)算。所以,人們發(fā)明出反碼來解決減法運(yùn)算的問題。

反碼是基于原碼計(jì)算得來的,表示方式是:正數(shù)的反碼是其本身。負(fù)數(shù)的反碼是在其原碼的基礎(chǔ)上, 符號位不變,其余各個(gè)位取反。

如,10 的 原碼為 0 1010 ,那么他的反碼同樣也是 0 1010 。

如,-2 的原碼為 1 0010 ,那么他的反碼為 1 1101 。

有了反碼之后,二進(jìn)制的運(yùn)算就可以帶著符號位一起了。并且可以直接將減法轉(zhuǎn)換成加法進(jìn)行運(yùn)算。但是使用反碼進(jìn)行運(yùn)算,需要注意以下幾點(diǎn):

  • 反碼運(yùn)算時(shí),其符號位與數(shù)值一起參加運(yùn)算。
  • 反碼的符號位相加后,如果有進(jìn)位出現(xiàn),則要把它送回到最低位去相加(循環(huán)進(jìn)位)。
  • 用反碼運(yùn)算,其運(yùn)算結(jié)果亦為反碼。在轉(zhuǎn)換為真值時(shí),若符號位為0,數(shù)位不變;若符號位為1,應(yīng)將結(jié)果求反才是其真值。

如 10 - 2 的在計(jì)算時(shí)需要轉(zhuǎn)成 10 + (-2)進(jìn)行計(jì)算:

 

0 1010(反) + 1 1101(反) = 0 0111(反) + 1(進(jìn)位) = 0 1000 ,因?yàn)榉栁皇?,表示正數(shù),所以他對應(yīng)的原碼也是0 1000(原),則十進(jìn)制值為8。

那么,我們再來計(jì)算法 2 - 10 ,把2 - 10轉(zhuǎn)換成 2 + (-10)進(jìn)行計(jì)算:

 

0 0010(反) + 1 0101(反) = 1 0111(反),因?yàn)榉栁皇?,表示負(fù)數(shù),所以他對應(yīng)的原碼也是1 1000(原),則十進(jìn)制為-8。

以上,我們通過幾個(gè)例子展示了反碼,我們知道使用反碼進(jìn)行計(jì)算的時(shí)候,可以帶著符號位一起計(jì)算,只需要在計(jì)算之后再將反碼轉(zhuǎn)換成原碼,再計(jì)算其對應(yīng)的十進(jìn)制就可以了。

但是,反碼運(yùn)算還是有一個(gè)小問題,我們看一下下面這個(gè)例子:

我們嘗試計(jì)算10 - 10 ,即 10 + (-10):

 

0 1010(反) + 1 0101(反) = 1 1111(反),因?yàn)榉栁皇?,表示負(fù)數(shù),所以他對應(yīng)的原碼也是1 0000(原),則十進(jìn)制為-0。

雖然很多人夠能夠理解+0和-0其實(shí)是一樣的,但是0帶符號仍然是沒有任何意義的。

如果一臺計(jì)算機(jī)有8位,我們想要用反碼表示0的話,就有0000 0000和 1111 1111兩種方式,分別表示+0和-0。

 

 

 


 

 

補(bǔ)碼

雖然反碼解決了減法的問題,但是對于0的符號問題卻沒有解決,于是補(bǔ)碼出現(xiàn)了。

補(bǔ)碼是在原碼和反碼的基礎(chǔ)上衍生出來的,補(bǔ)碼的表示方法是:正數(shù)的補(bǔ)碼就是其本身,負(fù)數(shù)的補(bǔ)碼是在其原碼的基礎(chǔ)上, 符號位不變, 其余各位取反,最后+1。(即在反碼的基礎(chǔ)上+1)

補(bǔ)碼計(jì)算的規(guī)則:

  • 補(bǔ)碼運(yùn)算時(shí),其符號位與數(shù)值一起參加運(yùn)算。
  • 補(bǔ)碼的符號位相加后,如果有進(jìn)位出現(xiàn),則進(jìn)位被舍棄。
  • 用反碼運(yùn)算,其運(yùn)算結(jié)果亦為補(bǔ)碼。在轉(zhuǎn)換成原碼時(shí),如果是正數(shù),其補(bǔ)碼就是原碼;如果是負(fù)數(shù),該補(bǔ)碼的補(bǔ)碼就是其原碼。

我們再來用補(bǔ)碼的方式,來計(jì)算下10 - 10 :

 

 

01010(補(bǔ)) + 10110(補(bǔ)) = 0 0000 (補(bǔ)),因?yàn)榉栁皇?,表示正數(shù),所以他對應(yīng)的原碼也是0 0000(原),則十進(jìn)制為0。

有了補(bǔ)碼,0的表達(dá)方式就唯一了,如果是8位的話,那么就是固定的0000 0000。

如果使用原碼或者反碼,8位的原碼或者反碼能表示的最小數(shù)字是-127,而使用補(bǔ)碼,能表示的最小數(shù)字是-128。

可見,使用補(bǔ)碼, 不僅僅修復(fù)了0的符號以及存在兩個(gè)編碼的問題, 而且還能夠多表示一個(gè)最低數(shù)。這就是為什么8位二進(jìn)制, 使用原碼或反碼表示的范圍為[-127, +127], 而使用補(bǔ)碼表示的范圍為[-128, 127]。

 

使用補(bǔ)碼的原因

通過以上介紹,我們知道了原碼、反碼和補(bǔ)碼的一些知識,我們嘗試著總結(jié)下為什么計(jì)算機(jī)中會最終選擇補(bǔ)碼來進(jìn)行存儲和計(jì)算數(shù)字。

1、計(jì)算機(jī)的運(yùn)算器為了實(shí)現(xiàn)簡單,傾向于在運(yùn)算過程中將減法轉(zhuǎn)換成加法,統(tǒng)一使用加法運(yùn)算器進(jìn)行計(jì)算。想要把減法轉(zhuǎn)化成加法運(yùn)算,就需要在運(yùn)算時(shí)帶著符號一起運(yùn)算,而反碼和補(bǔ)碼可以帶符號位一起運(yùn)算,也就方便了將減法轉(zhuǎn)換為加法。

2、采用補(bǔ)碼,可以解決編碼中有+0和-0兩種表示0的方式。

3、補(bǔ)碼表示的數(shù)字范圍要比原碼和反碼大。如8位2進(jìn)制,使用原碼或反碼表示的范圍為[-127, +127], 而使用補(bǔ)碼表示的范圍為[-128, 127]。

 

 

 


 

 

 


 

關(guān)于作者:漫話編程,是一個(gè)通過漫畫+音頻的形式講解枯燥的編程知識的公眾號。致力于讓編程變得更有樂趣。

本文轉(zhuǎn)載自微信公眾號「 漫話編程」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系 漫話編程公眾號。

 

責(zé)任編輯:武曉燕 來源: 漫話編程
相關(guān)推薦

2020-05-12 09:39:32

計(jì)算機(jī)時(shí)間系統(tǒng)

2011-12-01 10:55:16

超級計(jì)算機(jī)高性能計(jì)算Top500

2024-04-18 08:51:10

原碼反碼補(bǔ)碼

2024-02-22 08:17:31

十六進(jìn)制數(shù)字計(jì)算

2020-10-12 13:27:21

計(jì)算機(jī)瀏覽器電腦

2020-12-14 08:00:31

計(jì)算機(jī)計(jì)數(shù)程序

2012-12-16 15:26:49

超級計(jì)算機(jī)LinuxHPC

2018-03-07 17:47:16

藍(lán)屏計(jì)算機(jī)死機(jī)

2011-07-04 11:35:59

2020-04-21 10:25:29

計(jì)算機(jī)無法顯示編碼

2023-07-07 10:53:08

2015-09-30 11:22:19

計(jì)算機(jī)大數(shù)據(jù)

2023-05-30 18:32:31

計(jì)算機(jī)字節(jié)

2021-07-05 12:25:37

開源項(xiàng)目計(jì)算機(jī)專業(yè)貢獻(xiàn)代碼

2018-09-27 14:50:39

編程語言c語言計(jì)算機(jī)程序

2020-06-02 14:17:55

QWER排列鍵盤打印機(jī)

2016-01-22 11:09:40

計(jì)算機(jī)圖形學(xué)虛擬現(xiàn)實(shí)三維建模

2023-09-04 15:15:17

計(jì)算機(jī)視覺人工智能

2023-03-20 13:21:49

計(jì)算機(jī)

2024-08-23 08:43:08

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號