大家好,我是痞子衡,,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家講的是計算機原理知識點-整數(shù)表示,。 本系列痞子衡會給大家介紹一些關(guān)于計算機原理的有趣的知識點,,今天是系列第一節(jié)課,痞子衡要講的是計算機中最基礎(chǔ)的知識,,即整數(shù)數(shù)據(jù)表示法,。 一、何謂進(jìn)制 學(xué)過數(shù)字電路的朋友肯定知道數(shù)據(jù)的進(jìn)制表示法,,常見的有二進(jìn)制,、八進(jìn)制、十進(jìn)制,、十六進(jìn)制表示法,。在現(xiàn)實生活中我們所用的數(shù)據(jù)表示法是十進(jìn)制,即由0-9共10個數(shù)字表示所有數(shù)值,。 二,、整數(shù)編碼2.1 正負(fù)數(shù)表示(原碼) 數(shù)據(jù)在計算機中都是用二進(jìn)制來表示的,。對于無符號整數(shù)(正整數(shù)),比如uint8_t型,,8個bit均為數(shù)據(jù)位,,用二進(jìn)制表示其范圍為8'b00000000 ~ 8'b11111111(0~255),這種所有bit均為數(shù)據(jù)位以表示無符號整數(shù)的編碼方式即為原碼,。 2.2 減法的實現(xiàn)(反碼)數(shù)字電路里我們都聽說過加法器,,但沒有減法器的說法,說明計算機實際上僅支持加法運算,,對于正整數(shù)做加法運算用原碼沒有任何疑義,。那么對于無符號整數(shù)做減法運算(等同于有符號數(shù)的加法運算)怎么實現(xiàn)?我們嘗試著用原碼來代入運算,,比如129-7(即129+(-7)): 8'b10000001(129原碼) + 8'b10000111(-7原碼)-------------- = 8'b????????(符號位如何參與運算,?) =9'b100001000(不區(qū)別符號位,直接運算,,最高bit由于溢出被自動丟棄) = 8'b00001000(結(jié)果為8) 我們似乎遇到了困難,,有符號運算數(shù)的符號位如何參與運算?如果我們不區(qū)別對待符號位,,直接把它當(dāng)做數(shù)據(jù)位進(jìn)行計算,,得出的結(jié)果顯然是不對的,,所以原碼是無法被用作減法/有符號數(shù)的計算的。為了解決這個問題,,此時引入了第二種編碼方式規(guī)定(反碼),,即正數(shù)的反碼與原碼相同,負(fù)數(shù)的反碼等于原碼除了符號位外,,其余數(shù)據(jù)位全部取反,。有了反碼,此時我們用反碼重新計算129-7:
2.3 消除+/-0之爭(補碼)反碼看起來似乎解決了減法問題,,不妨讓我們再做一個減法運算,,比如5-5,,我們嘗試再一次用反碼解決問題: 8'b00000101(5反碼) + 8'b11111010(-5反碼)-------------- = 8'b11111111(結(jié)果為反碼) = 8'b10000000(轉(zhuǎn)換成原碼,,根據(jù)有符號數(shù)原碼編碼規(guī)定解析為-0) -0是等于0的,,運算的結(jié)果是對的,,但是不是總感覺哪里不對,?是的,原碼8'b00000000表示+0,,我們已經(jīng)有+0來表示0了,,再用-0表示0顯得多此一舉,浪費了一個編碼值,。怎么解決這個問題,?此時引入第三種編碼方式規(guī)定(補碼),正數(shù)的補碼與原碼相同,,負(fù)數(shù)的補碼等于反碼加1.那現(xiàn)在我們嘗試用補碼來重新計算5-5:
上述運算中使用補碼消除了運算結(jié)果為-0的問題,,但還是沒有告訴我們8'b10000000的值到底是多少,?顯然不應(yīng)該是-0,那么應(yīng)該要怎么解析8'b10000000,?有朋友說答案是-128,,是的,前面我們已經(jīng)在原碼一節(jié)中給出了答案,,那如何來理解這個答案,?首先我們得要從標(biāo)準(zhǔn)原碼定義的角度來說-128,,按照定義-128的原碼應(yīng)該是9'b110000000,轉(zhuǎn)換成補碼還是9'b110000000,,原碼與補碼一致,,截斷最高位后可得8'b10000000,講到這里,,我們似乎有點明白-128的由來了,,但這樣真的靠譜嗎?代入運算會不會影響運算結(jié)果的正確性,?我們來試試看-128+17: 8'b10000000(-128補碼) + 8'b00010001(17補碼)-------------- = 8'b10010001(結(jié)果為補碼) = 8'b10010000(轉(zhuǎn)換為反碼) = 8'b11101111(轉(zhuǎn)換為原碼,,由于最高bit為1,即表示負(fù)數(shù),,其值為-111) 由于用8'b10000000來表示-128參與運算并不會導(dǎo)致結(jié)果錯誤,,那么何不直接約定用8'b10000000來表示-128呢?好,,就這么愉快的決定了,!這就是-128=8'b10000000的由來。其實就是計算機里的一個異常的人為規(guī)定而已,! 2.4 編碼小結(jié) 無論uint8_t/int8_t型數(shù)據(jù)全部使用補碼的方式在計算機中進(jìn)行存儲,,其中int8_t型數(shù)據(jù)范圍內(nèi)-128是個異常規(guī)定,無法用補碼編碼規(guī)則直接解釋,,但計算機可以自動理解識別,。
至此,,計算機原理知識點之整數(shù)表示痞子衡便介紹完畢了,掌聲在哪里~~~ |
|