《计算机科学概论》—第3章3.2节数字数据表示法
本節(jié)書(shū)摘來(lái)自華章出版社《計(jì)算機(jī)科學(xué)概論》一書(shū)中的第3章,第3.2節(jié)數(shù)字?jǐn)?shù)據(jù)表示法,作者[美]內(nèi)爾·黛爾(Nell Dale)約翰·路易斯(John Lewis),更多章節(jié)內(nèi)容可以訪問(wèn)云棲社區(qū)“華章計(jì)算機(jī)”公眾號(hào)查看。
3.2 數(shù)字?jǐn)?shù)據(jù)表示法
數(shù)值是計(jì)算機(jī)系統(tǒng)最常用的數(shù)據(jù)類型。與其他數(shù)據(jù)類型不同的是,不必把數(shù)字?jǐn)?shù)據(jù)映射到二進(jìn)制代碼。因?yàn)槎M(jìn)制也是一種記數(shù)系統(tǒng),所以在數(shù)字?jǐn)?shù)據(jù)和計(jì)算機(jī)存儲(chǔ)的表示它們的二進(jìn)制數(shù)值之間有種自然對(duì)應(yīng)的關(guān)系。通常對(duì)正整數(shù)來(lái)說(shuō)都是這樣的。在第2章關(guān)于二進(jìn)制系統(tǒng)和其他等價(jià)記數(shù)系統(tǒng)的討論中,我們介紹了整數(shù)轉(zhuǎn)換的問(wèn)題。但是,還有其他關(guān)于數(shù)字?jǐn)?shù)據(jù)表示法的問(wèn)題需要考慮,整數(shù)不過(guò)是數(shù)字?jǐn)?shù)據(jù)的一部分。這一節(jié)將討論負(fù)數(shù)和非整數(shù)數(shù)值的表示法。
3.2.1 負(fù)數(shù)表示法
負(fù)數(shù)只是前面帶有負(fù)號(hào)的數(shù)嗎?也許吧。這當(dāng)然是看待負(fù)數(shù)的有效方式之一。讓我們來(lái)探討關(guān)于負(fù)數(shù)的問(wèn)題,討論在計(jì)算機(jī)上表示負(fù)數(shù)的適當(dāng)方式。
符號(hào)數(shù)值表示法
從初次在中學(xué)學(xué)習(xí)負(fù)數(shù)開(kāi)始,你就使用過(guò)數(shù)的符號(hào)數(shù)值表示法。在傳統(tǒng)的十進(jìn)制系統(tǒng)中,數(shù)值之前帶有符號(hào)(+或-),只不過(guò)正號(hào)通常被省略。符號(hào)表示了數(shù)所屬的分類,數(shù)字表示了它的量值。標(biāo)準(zhǔn)的實(shí)數(shù)直線圖如下,其中負(fù)號(hào)表示該數(shù)位于0的左側(cè),正數(shù)位于0的右側(cè)。
符號(hào)數(shù)值表示法(signed-magnitude representation):符號(hào)表示數(shù)所屬的分類(正數(shù)或負(fù)數(shù))、值表示數(shù)的量值的數(shù)字表示法。
對(duì)帶符號(hào)的整數(shù)執(zhí)行加法和減法操作可以被描述為向一個(gè)方向或另一個(gè)方向移動(dòng)一定的數(shù)字單位。要求兩個(gè)數(shù)的和,即找到第一個(gè)數(shù)的刻度,然后向第二個(gè)數(shù)的符號(hào)所示的方向移動(dòng)指定的數(shù)字單位。執(zhí)行減法的方式一樣,即按照符號(hào)所示的方向沿著實(shí)數(shù)直線圖移動(dòng)指定的單位。在中學(xué),即使不使用實(shí)數(shù)直線圖,你也能夠很快掌握加法和減法運(yùn)算。
符號(hào)數(shù)值表示法有一個(gè)問(wèn)題,即表示0的方法有兩種:一種是+ 0,一種是- 0。我們不會(huì)對(duì)- 0感到迷惑,忽略它即可。但是,在計(jì)算機(jī)中,0的兩種表示法卻會(huì)引起不必要的麻煩,所以還有其他表示負(fù)數(shù)的方法。讓我們來(lái)分析另一種負(fù)數(shù)表示法。
定長(zhǎng)量數(shù)
如果只允許用定量的數(shù)值,那么可以用一半數(shù)表示正數(shù),另一半數(shù)表示負(fù)數(shù),符號(hào)由數(shù)的量值決定。例如,假定能夠表示的最大十進(jìn)制數(shù)是99,那么可以用1到49表示正數(shù)1到49,用50到99表示負(fù)數(shù)- 50到- 1。這種表示法的實(shí)數(shù)直線圖如下所示,它標(biāo)示了上面的數(shù)對(duì)應(yīng)的負(fù)數(shù)。
在這種模式下執(zhí)行加法,只需要對(duì)兩個(gè)數(shù)求和,然后舍棄進(jìn)位即可。求兩個(gè)正數(shù)的和應(yīng)該沒(méi)有什么問(wèn)題,讓我們來(lái)嘗試求一個(gè)正數(shù)加一個(gè)負(fù)數(shù)、一個(gè)負(fù)數(shù)加一個(gè)正數(shù)以及兩個(gè)負(fù)數(shù)相加。下表分別列出了用符號(hào)數(shù)值表示法和用這種模式執(zhí)行的加法運(yùn)算。(注意,進(jìn)位被舍棄了。)
符號(hào)數(shù)值表示法 新模式
?????5
- ?- 6
???- 1 ????5 - ?94
???99
???- 4
- ???6
?????2 ???96 - ??6
????2
???- 2
- ?- 4
???- 6 ???98 - ?96
???94
用這種模式表示的負(fù)數(shù)的減法運(yùn)算又如何呢?關(guān)鍵是加法和減法之間的關(guān)系,即A - B=A + (- B)。從一個(gè)數(shù)中減去另一個(gè)數(shù),等價(jià)于給第一個(gè)數(shù)加上第二個(gè)數(shù)的負(fù)數(shù)。
符號(hào)數(shù)值表示法 新模式 加負(fù)數(shù)
??- 5
- ??3
??- 8 ???95 -
??3
????95 - ??97
????92
在這個(gè)例子中,我們假定只有100個(gè)數(shù)值,這個(gè)數(shù)量非常小,使我們能夠用實(shí)數(shù)直線圖來(lái)計(jì)算一個(gè)數(shù)的負(fù)數(shù)(Negative)表示法。不過(guò),要計(jì)算負(fù)數(shù)表示法,可以采用下列公式。
Negative (I) = 10k - I,其中k是數(shù)字個(gè)數(shù)
在兩位數(shù)字表示法中,求- 3的表示法的公式如下:
- (3) = 102 - 3 = 97
在三位數(shù)字表示法中,求- 3的表示法的公式如下: - (3) = 103- 3 = 997
這種負(fù)數(shù)表示法稱為十進(jìn)制補(bǔ)碼。雖然人類以符號(hào)和量值表示數(shù)字,但在電子計(jì)算中,補(bǔ)碼在某些方面更方便。由于現(xiàn)代計(jì)算機(jī)存儲(chǔ)任何數(shù)據(jù)采用的都是二進(jìn)制,所以我們采用與十進(jìn)制補(bǔ)碼等價(jià)的二進(jìn)制補(bǔ)碼。
十進(jìn)制補(bǔ)碼(ten′s complement):一種負(fù)數(shù)表示法,負(fù)數(shù)I用10的k次冪減I表示。
二進(jìn)制補(bǔ)碼
假定數(shù)字只能用八位表示,七位表示數(shù)值,一位表示符號(hào)。為了便于查看長(zhǎng)的二進(jìn)制數(shù),我們把實(shí)數(shù)直線圖繪制成垂直的。
如果將十進(jìn)制替換為二進(jìn)制,那么補(bǔ)碼公式還會(huì)有效嗎?也就是說(shuō),我們能不能用公式“Negative(I) = 2k - I”來(lái)計(jì)算用負(fù)二進(jìn)制表示的數(shù)值呢?讓我們嘗試看看:
- (2) = 27 - 2 = 128 - 2 = - 126
十進(jìn)制數(shù)126用八進(jìn)制表示是176,用二進(jìn)制表示是11111110,但是左邊多了一個(gè)位數(shù)“1”。是出錯(cuò)了嗎?并不是,因?yàn)檫@是一個(gè)負(fù)數(shù),最左邊的位數(shù)表示了這個(gè)數(shù)字是負(fù)數(shù)還是正數(shù)。如果最左邊一位是“0”,那么說(shuō)明這個(gè)數(shù)字是正數(shù);如果是“1”說(shuō)明這個(gè)數(shù)字是負(fù)數(shù)。因此“- 2”表示為“11111110”。
有一個(gè)更簡(jiǎn)單的方法來(lái)計(jì)算二進(jìn)制補(bǔ)碼:將每一位取反再加一。也就是,取數(shù)字的正值,將所有“1”變成“0”,將所有的“0”變成“1”,再加1。
使用十進(jìn)制補(bǔ)碼計(jì)算加法和減法的方式和二進(jìn)制補(bǔ)碼是一樣的:
使用這種表示法,負(fù)數(shù)的最左邊一位總是1。因此,在二進(jìn)制補(bǔ)碼中,你可以立刻識(shí)別出一個(gè)數(shù)是正數(shù)還是負(fù)數(shù)。
數(shù)字溢出
當(dāng)我們分配給結(jié)果的位數(shù)存不下計(jì)算出的值時(shí),將發(fā)生溢出。例如,如果使用八位來(lái)存儲(chǔ)每個(gè)值,那么127加3的結(jié)果將溢出:
溢出(overf?low):給結(jié)果預(yù)留的位數(shù)存不下計(jì)算出的值的狀況。
在我們的模式中,10000010表示- 126,而不是 + 130。但是,如果表示的不是負(fù)數(shù),這個(gè)結(jié)果將是正確的。
溢出是把無(wú)限的世界映射到有限的機(jī)器上會(huì)發(fā)生的典型問(wèn)題。無(wú)論給一個(gè)數(shù)字分配多少位,總有潛在的表示這些位不能滿足的數(shù)的需要。對(duì)于如何解決溢出問(wèn)題,不同的計(jì)算機(jī)硬件和不同的程序設(shè)計(jì)語(yǔ)言有自己獨(dú)特的方法。
3.2.2 實(shí)數(shù)表示法
在計(jì)算中,我們把非整數(shù)的值稱為實(shí)值。根據(jù)實(shí)數(shù)在計(jì)算機(jī)中的用途,把它定義為可能具有小數(shù)部分的值。也就是說(shuō),實(shí)數(shù)具有整數(shù)部分和小數(shù)部分,每個(gè)部分都可能是0。例如,104.32、0.999?999、357.0和3.141?59都是十進(jìn)制實(shí)數(shù)。
我們?cè)诘?章中介紹過(guò),用數(shù)字的位置表示數(shù)值,位值是由基數(shù)決定的。在十進(jìn)制中,小數(shù)點(diǎn)左側(cè)的位值有1、10、100,依此類推。它們都是基數(shù)的冪,從小數(shù)點(diǎn)開(kāi)始向左,每一位升高一次冪。小數(shù)點(diǎn)右側(cè)的位值也是這樣得到的,只不過(guò)冪是負(fù)數(shù)。所以,小數(shù)點(diǎn)右側(cè)的位置是十分位(10- 1或十分之一)、百分位(10- 2或百分之一),依此類推。
二進(jìn)制采用的是同樣的規(guī)則,只是基數(shù)為2。由于處理的不是十進(jìn)制數(shù),所以使用radix point來(lái)命名小數(shù)點(diǎn),任何記數(shù)系統(tǒng)都可以使用這個(gè)術(shù)語(yǔ)。在二進(jìn)制中,小數(shù)點(diǎn)右側(cè)的位置是二分位(2- 1或二分之一)、四分位(2- 2或四分之一),依此類推。
那么如何在計(jì)算機(jī)中表示一個(gè)實(shí)值呢?我們把實(shí)數(shù)存儲(chǔ)為一個(gè)整數(shù)加指示小數(shù)點(diǎn)位置的信息。也就是說(shuō),任何實(shí)值都可以由三個(gè)屬性描述,即符號(hào)(正號(hào)或負(fù)號(hào))、尾數(shù)和指數(shù),尾數(shù)由該數(shù)值中的數(shù)字構(gòu)成,假定小數(shù)點(diǎn)在其右邊,而指數(shù)確定了小數(shù)點(diǎn)相對(duì)于尾數(shù)的位移。十進(jìn)制的實(shí)值可以用下列公式定義:
符號(hào)×尾數(shù)×10exp
這種表示法稱為浮點(diǎn)表示法,因?yàn)閿?shù)字的個(gè)數(shù)是固定的,但是小數(shù)點(diǎn)卻是浮動(dòng)的。在用浮點(diǎn)形式表示的數(shù)值中,正指數(shù)將把小數(shù)點(diǎn)向右移,負(fù)指數(shù)將把小數(shù)點(diǎn)向左移。
**小數(shù)點(diǎn)(radix point):在記數(shù)系統(tǒng)中,把一個(gè)實(shí)數(shù)分割成整數(shù)部分和小數(shù)部分的點(diǎn)。
浮點(diǎn)表示法(f?loating point):標(biāo)明了符號(hào)、尾數(shù)和指數(shù)的實(shí)數(shù)表示法。**
讓我們來(lái)看看如何把實(shí)數(shù)常用的十進(jìn)制表示法轉(zhuǎn)換成浮點(diǎn)表示法。例如,考慮實(shí)數(shù)148.69,符號(hào)是正號(hào),小數(shù)點(diǎn)右邊有兩位數(shù)字,因此,指數(shù)是- 2,浮點(diǎn)表示法即14?869×10 - 2。表3-1給出了其他例子。為了便于討論,假設(shè)只能表示五位數(shù)字。
表3-1 十進(jìn)制表示法和浮點(diǎn)表示法表示的(五位數(shù)字)值
實(shí) 值 浮點(diǎn)值 實(shí) 值 浮點(diǎn)值
12001.00 12001100 - 123.10 - 12?31010- 2
- 120.01 - 1200110- 2 155?555?000.00 15?555103
0.12000 12000*10- 5
如何把浮點(diǎn)數(shù)轉(zhuǎn)換回十進(jìn)制表示法呢?基數(shù)上面的指數(shù)說(shuō)明了小數(shù)點(diǎn)要移動(dòng)多少位。如果指數(shù)是負(fù)數(shù),小數(shù)點(diǎn)要向左移;如果指數(shù)是正數(shù),小數(shù)點(diǎn)要向右移。對(duì)表3-1中的浮點(diǎn)數(shù)應(yīng)用這個(gè)規(guī)則。
注意表3-1中的最后一個(gè)例子,它丟失了信息。因?yàn)槲覀冎槐4嫖逦粩?shù)字來(lái)表示有效數(shù)字(尾數(shù)),所以這個(gè)值的整數(shù)部分在浮點(diǎn)表示法中沒(méi)有被精確地表示出來(lái)。
同樣,下面的公式定義了一個(gè)二進(jìn)制浮點(diǎn)值:
符號(hào)×尾數(shù)×2exp
注意,只有基數(shù)改變了。當(dāng)然,尾數(shù)只能包含二進(jìn)制數(shù)字。要在計(jì)算機(jī)上存儲(chǔ)二進(jìn)制的浮點(diǎn)數(shù),可以保存定義它的三個(gè)值。例如,根據(jù)一條通用準(zhǔn)則,如果用64位存儲(chǔ)一個(gè)浮點(diǎn)值,那么其中1位存儲(chǔ)符號(hào),11位存儲(chǔ)指數(shù),52位存儲(chǔ)尾數(shù)。當(dāng)一個(gè)值用于計(jì)算或顯示時(shí),都會(huì)采用這種格式。
如果一個(gè)數(shù)不完整,那么如何才能得到尾數(shù)的正確值呢?在第2章中,我們討論過(guò)如何把自然數(shù)從一種記數(shù)系統(tǒng)轉(zhuǎn)換到另一種記數(shù)系統(tǒng)。這里,我們用十進(jìn)制的例子說(shuō)明了在計(jì)算機(jī)中如何表示實(shí)數(shù)。我們知道,計(jì)算機(jī)中的所有數(shù)值都是用二進(jìn)制表示的。那么如何把十進(jìn)制數(shù)的小數(shù)部分轉(zhuǎn)換成二進(jìn)制的呢?
把一個(gè)整數(shù)從十進(jìn)制轉(zhuǎn)換成其他數(shù)制,需要用新基數(shù)除這個(gè)數(shù),余數(shù)是結(jié)果左邊的下一位數(shù)字,商是新的被除數(shù),整個(gè)過(guò)程直到商為0終止。轉(zhuǎn)換小數(shù)部分的操作是類似的,只不過(guò)不是用新基數(shù)除這個(gè)數(shù),而是用新基數(shù)乘它。乘法的進(jìn)位將成為答案右邊的下一位數(shù)字,乘法結(jié)果中的小數(shù)部分將成為新的被乘數(shù),整個(gè)過(guò)程直到乘法結(jié)果中的小數(shù)部分為0截止。讓我們把0.75轉(zhuǎn)換成二進(jìn)制的。
0.75 * 2 = 1.50
0.50 * 2 = 1.00
因此,十進(jìn)制中的0.75是二進(jìn)制中的0.11。讓我們?cè)僮鲆粋€(gè)轉(zhuǎn)換。
因此,十進(jìn)制中的0.435是二進(jìn)制中的011011…。小數(shù)部分會(huì)變成0嗎?繼續(xù)乘下去,看看結(jié)果如何。
下面讓我們看一個(gè)完整的轉(zhuǎn)換過(guò)程:把十進(jìn)制的20.25轉(zhuǎn)換成二進(jìn)制的。首先,轉(zhuǎn)
換20。
20在二進(jìn)制中等價(jià)于10100。現(xiàn)在我們來(lái)轉(zhuǎn)換小數(shù)部分:
0.25 * 2 = 0.50
0.50 * 2 = 1.00
因此,十進(jìn)制的20.25在二進(jìn)制中是10100.01。
科學(xué)記數(shù)法可能是你已經(jīng)熟悉的術(shù)語(yǔ),所以我們?cè)谶@里只簡(jiǎn)要介紹一下。科學(xué)記數(shù)法是浮點(diǎn)表示法的一種形式,其中,小數(shù)點(diǎn)總在最左邊數(shù)字的右側(cè)。也就是說(shuō),整數(shù)部分只有一位。在許多程序設(shè)計(jì)語(yǔ)言中,如果在輸出一個(gè)大的實(shí)數(shù)值時(shí)沒(méi)有指定輸出格式,那么這個(gè)值將以科學(xué)記數(shù)法輸出。因?yàn)樵缙诘臋C(jī)器不能輸出指數(shù),所以用字母“E”代替。例如,在科學(xué)記數(shù)法中,12001.32708將被寫(xiě)為1.200132708E + 4。
科學(xué)記數(shù)法(scientif?ic notation):另一種浮點(diǎn)表示法。
總結(jié)
以上是生活随笔為你收集整理的《计算机科学概论》—第3章3.2节数字数据表示法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《CCNP SWITCH 300-115
- 下一篇: 关于在 Ubuntu 上安装 Steam