日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

计算机组成定点数的编码,2.1.1 定点数的表示

發布時間:2023/11/27 生活经验 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机组成定点数的编码,2.1.1 定点数的表示 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2.1 數據的表示

2.1.1 定點數的表示

1.原碼表示法

在實際生活中,我們遇到的數據一般是十進制的、帶正/負號的、帶小數點的。但遺憾的是,截至目前,計算機能直接處理還只是由0和1組成的二進制數。因此,在計算機中,十進制數必須轉換成二進制數(轉換方法參見附錄C),并且用0表示正號,用1表示負號。這樣的符號“數字化”的二進制數稱為機器數。相對而言,帶+/-號的數稱為真值。

為了簡化設計與制造,計算機不直接表示小數點,而是默認小數點位于數值的前部或者后部,這樣表示的數據稱為定點數(Fixed Point Number)。小數點被默認位于數值前部的叫定點小數,被默認位于數值后部的叫定點整數。一般的計算機只選擇實現一種定點數。

在早期采用定點小數的計算機里,大于1的數據必須先通過適當的比例因子轉換成小于1的數據,并保證運算的中間結果也是小于1的,在輸出結果時再將數據按比例放大、還原。采用定點小數的計算機是最節省硬件的。

在定點數的表示格式中,最高位(The Most Significant Bit,MSB)被當作符號位(Sign Bit)。也就是說,定點數的最高位為0,表示它是正數;為1,表示它是負數。

在機器實現中,定點數的小數點是不實現、不保存的。但是為了便于人們閱讀時區別定點小數和定點整數,在定點數的書面表示中,一般在定點小數的符號位后加上一個“.”,在定點整數的符號位后加上一個“,”。

這樣就得到了計算機中定點數最直觀的表示方法:符號—絕對值表示法(The Sign-Magnitude Representation)。在我國,這種表示法稱為原碼表示法。例如,

X =+1011010B,[X]原=0, 1011010B;

Y=-1011010B,[Y]原=1, 1011010B;

Z=+0.1101010B,[Z]原=0. 1101010B;

K=-0.1101010B,[K]原=1. 1101010B。

事實上,一個二進制數據的具體原碼表示依賴于機器的字長,機器字的最高位為符號位。

例如,Y=- 011010B,機器字長是8位時,[Y]原=1,1011010B;機器字長是16位時,[Y]原=1,000000001011010B。

【例2-1】 設機器字長為8位,X=-0101010B,Y=+1010101B,求[X]原 和[Y]原=?

答:[X]原=10101010B,[Y]原=01010101B。

【例2-2】 設機器字長為8位,X=0,求[X]原=?

答:對于零(0)而言,其原碼中的符號位取0、取1都是可以的。

所以[0]原=10000000B或者[0]原=00000000B。

從例2-2可以看出:零(0)的原碼表示有兩種形式:正零和負零。這就給計算機實現“判斷一個數是否等于零”(這是程序中一個常見的操作)帶來麻煩。后面我們將會看到:這個問題可以通過引入補碼(Complement)來解決。

由于需要拿出一位二進制數位來表示符號,所以原碼表示的n位定點整數的表示范圍是:+(2 n-1-1) ~-(2 n-1-1)。例如8位定點整數的表示范圍是:-(27-1)~+(27-1),即-127~+127;16位定點整數的表示范圍是:-(215-1)~+(215-1),即-32767~+32767。

原碼表示的n位定點小數的表示范圍是:-[1-2-(n-1) ]~+[1-2-(n-1) ]。

從理論上,n位二進制數共有2 n個碼點(Pattern),能夠表示2n個數據,但是原碼表示的n位定點整數的表示范圍是-(2 n-1-1)~+(2 n-1-1),只表示了2 n-1個數據,其原因就是零(0)的原碼占去了兩個碼點。

由于n位二進制數需要拿出1位作為符號位,所以它能夠表示的最大數的絕對值是(2n-1-1)。為了能夠表示絕對值更大的數據,在數據都是正數的情況下,可以把符號位省略掉,n個二進制數位全部用來表示數據的數值。這樣表示的整數稱為無符號數(Unsigned Integer)。n位無符號數的表示范圍是:0~+(2n-1)。例如8位無符號數的表示范圍是:0~255,16位無符號數的表示范圍是:0~65535。

從這個意義上說,定點數可分為帶符號數和無符號數。原碼表示法和下面將要介紹的補碼、反碼表示法都是針對帶符號數的。

原碼表示法簡單明了,易于和真值轉換,乘、除法運算的規則比較簡單(詳見2.2節),但是它最主要的缺點是加、減運算的實現比較復雜,即在執行用戶指定加、減運算時,不能簡單地直接進行加、減運算。它需要先判斷兩個操作數的符號及其絕對值的相對大小,然后再執行所需要的運算。例如,兩數相加時,先比較符號位,若同號,則做加法,否則做減法。在做減法時,先比較兩個數絕對值的相對大小,然后用絕對值大的數減去絕對值小的數,結果的符號取絕對值大的操作數符號。比如,用戶指定(+5)-(-3),最終機器執行的是:5+3;用戶指定(+5)+(-3),最終機器執行的是:5-3。

由此可見,采用原碼表示法會導致加、減運算既復雜又費時,而且用戶指定的加法運算有時卻要使用減法器。那么,能否找到一個與負數等價的正數來代替該負數,然后用加法來代替減法呢?

可以!機器數采用補碼表示就能實現這個愿望—ALU中只設加法器,只做加法操作。

2.補碼表示法

引入補碼表示法的目的是將加、減運算統一為加法運算,簡化計算機的控制與實現。在介紹補碼之前,我們先來介紹一下“模(Module)”的概念。

在我們日常使用的鐘表中,假設當前時間是3點,而鐘表快了2小時,它的時針已經指到了5點,就需要將時針調回到3點,即時針指向的數字5要變成3。

實現這個目的的方法有兩個,一個是將時針逆時針撥兩格(即真的減去2),另外一個是將時針順時針撥10格(即加上10)。

為什么時針從5加上10卻等于3呢?這是因為鐘表上“小時數”都是以12為“模”,即“小時數”等于用12去除然后取余數。所以5+10=15 ( mod 12 )=3。

由此可見,在 “模為12”的意義下,“減去2”與“加上10”是等價的。我們稱(-2)相對于“模為12”的補為:12-|-2|=10。

在計算機中,定點整數的補碼是以2n為模。對于一個n位的定點整數X,如果X是一個正數,則它的補碼與原碼完全相同;如果X是一個負數,則它的補碼就等于2n-|X|。

例如,在機器字長為8位的情況下,[+1]補=00000001B,[+127]補=01111111B,[-1]補=28-1=11111111B,[-127]補=28-127=10000001B。

值得注意的是:設機器字長為8位,超出部分自動丟失。[+0]補=00000000B,[-0]補=28-0=00000000B。可見,補碼表示法中,零(0)的表示形式就統一了。

那么,原碼中用于表示負零的那個碼點10000000B不就空閑了嗎?

不用擔心,它在定點整數補碼表示中被指定用來表示-2n- 1,即-128(n=8)或-32768 (n=16);在定點小數補碼表示中被指定用來表示-1。

在實際應用中,補碼往往是從原碼轉換來的。轉換的口訣是:正數的補碼就是它的原碼;負數的補碼是將其原碼,除符號位外,每位取反(即0變成1,1變成0),然后在最低位(The Least Significant Bit,LSB)加1而得。

感興趣的讀者可以用數學的方法證明這個口訣。

【例2-3】 設機器字長為8位,X=- 46,求[X]補 =?

答:[X]原 = 10101110B。

除符號位外,對[X]原每位取反得到11010001B,在最低位加1得到11010010B。

所以,[X]補 =11010010B。

【例2-4】 設機器字長為16位,Y=-116,求[Y]補=?

答:[Y]原=1000 0000 0111 0100B。則 [Y]補=1111 1111 1000 1100B。

為簡潔起見,在書寫上述運算結果時,常采用十六進制表示(二進制轉換成十六進制的方法參見附錄C)。所以,[Y]補=1111 1111 1000 1100B = FF8CH。

觀察上面兩道例題的結果,一個負數的原碼從它的低位算起,遇到第一個“1”時,原碼與補碼是相同的。超過這個“1”直至符號位之間的那段數位,原碼與補碼是相反的。這是一個很有價值的結論,可用于簡化求補碼電路的設計。

采用補碼表示的n位定點整數的表示范圍是:-2 n-1~+(2 n-1-1)。

例如,8位定點整數的補碼表示范圍是-27~+(27-1),即-128~+127;16位定點整數的補碼表示范圍是:-215~+(215-1),即-32768~+32767。

至于補碼表示的n位定點小數的表示范圍,請讀者自行求解。

最后,需要補充說明的是:由原碼求補碼的口訣也同樣適合于由補碼求原碼。因為一個數的原碼和它的補碼是互為補碼的。

無論是寄存器還是內存單元都是定長的,如32位或16位。一個用8位補碼表示的定點整數要存入長度更大的存儲單元時,需要進行“符號位擴展”,即空出的高位用補碼的最高位(符號位)填充。

類似的,ALU也只能對兩個等長的操作數進行運算。當兩個操作數不等長時,短的操作數在參與運算前,也要做“符號位擴展”。

【例2-5】 (2012年碩士研究生入學統一考試 計算機專業基礎綜合考試試題)

假定編譯器規定int和short類型長度分別為32位和16位,執行下列C語言語句:

unsigned short??x=65530;

unsigned int??y=x;

得到y的機器數為_。

A. 0000 7FFAH?B. 0000 FFFAH??C. FFFF 7FFAH??D. FFFF FFFAH

答:x(值為65530)的機器數為1111 1111 1111 1010B。

對于無符號數, unsigned short類型數據賦給unsigned int類型數據,不需要做符號位擴展。則y的機器數為0000 0000 0000 0000 1111 1111 1111 1010B=0000FFFAH。故選B。

3.反碼表示法

反碼通常作為由原碼求補碼或者由補碼求原碼的中間過渡。

對于正數,反碼與原碼和補碼相同,直接在二進制數值前面加上符號位“0”即可。對于負數,反碼就是將負號“-”替換成“1”然后將二進制數值逐位取反而得到。

在反碼中,零有兩個編碼:定義為:[+0]反=000…00B,[-0]反=111…111B。

回顧求補碼的過程可知:對于一個負數,求反碼與求補碼的差別僅在于“末位是否加1”。所以,有人稱補碼為“2的補碼(Two抯 Complement)”,稱反碼為“1的補碼(One抯 Complement)”。

4.移碼表示法

原碼、補碼和反碼,它們的一個共同特點是將符號作為最高位,與其數值部分一起編碼。正號用“0”表示,負號用“1”表示。這就給比較不同符號的數據之間的相對大小,帶來麻煩。例如,采用原碼時,正數01010101B大于負數11010101B。但是機器認為“1”比“0”大,所以11010101B>01010101B。可見,機器比較的結果與真實情況不符。

如果給每一個二進制整數的真值加上一個常數2n(n為二進制真值的位數),使得正數的最高位變成“1”、負數的最高位變成“0”,那么,機器比較得到的兩個數之間的相對大小就是其真實的相對大小。這樣得到的編碼稱為“移碼(Biased Representation)”。

移碼的定義:[X]移=2n+X。其中X是n位二進制整數的真值,即-2n ≤X≤2n-1。

由于移碼在編碼中只是加上了一個常數,并沒有改變數據之間原本的大小順序,所以移碼主要用于需要對定點整數(如下一節將要介紹的浮點數的階碼)進行大小比較的場合。

例如:X=0101011B,[X]移=27+X=10000000B + 0101011B= 10101011B;

Y=- 0101011B,[Y]移=27+Y=10000000B + (-0101011B) = 01010101B;

比較其大小,10101011B>01010101B,所以X>Y。

特別的,X=0000000B,[X]移=27+X=10000000B + 0000000B= 10000000B;

Y = -0000000B,[Y]移=27 + Y = 10000000B + (-0000000B) = 10000000B;

所以,[+0]移=[-0]移。在移碼中,零(0)有唯一的編碼。

部分8位定點整數的移碼如表2-1所示。從表中可以看出,同一個真值的移碼與其補碼的差別僅僅是最高位相反。將補碼的符號位取反,即可得到其對應真值的移碼。

注意:移碼表示僅僅是針對定點整數而言的,定點小數沒有移碼的定義。

總結

以上是生活随笔為你收集整理的计算机组成定点数的编码,2.1.1 定点数的表示的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。