1. 程式人生 > 其它 >計算機組成原理-運算方法之資料格式

計算機組成原理-運算方法之資料格式

資料格式

先說下資料格式,在選擇計算機數的表示方式時,需要考慮以下幾個因數:

  1. 要表達的書的型別(小數,整數,實數,複數)
  2. 可能遇到的數值範圍
  3. 數值精度
  4. 資料儲存和處理所需要的硬體代價

計算機中常用的資料表示格式有兩種,一是定點格式,二是浮點格式。

定點數的表示方式

所謂定點格式,即約定機器中所有資料的小數點位置是固定不變的。通常將資料表示成純小數純整數

用一個n+1位數來表示一個定點數X,其中一位Xn用來表示數的符號,其餘數代表他的量值。為了將整個n+1位統一處理,符號位Xn放在最左位置,並用數值01分別代表正號和負號,這樣,對於任意定點數X = Xn Xn-1 …… X1 X0,在定點機中可以表示位如下形式:

純小數

如果數X表示是純小數,那麼小數點位於XnXn-1之間。當XnXn-1……X1X0各位均為0是,數X的絕對值最小,即|X|min = 0;當各位均為1時,X的絕對值最大,即|X|max = 1-2^-n,故數的表達範圍為

純整數

如果數X表示純整數,那麼小數點位於最低位X0的右邊,此時數X的表示範圍為:

浮點數的表示方式

浮點表示法:把一個數的有效數字和數的範圍在計算機的一個儲存單元中分別予以表示。這種把數的範圍和精度分別表示的方法,相當於數的小數點位置隨比例影子的不同而在一定範圍內自由浮動。

eg:

9 X 10^-28 = 0.9 X 10^-29

因此任意一個十進位制數N可以寫成:

同樣的,在計算機中,任意一個二進位制數N可以寫成

其中,M成為浮點數的尾數,是一個純小數。e是比例因子的指數,稱為浮點數的指數,是一個整數。比例因子的基數 2對二進計數制的機器是一個常數。

在機器中表示一個浮點數時,一定要給出尾數,用定點小數形式表示。尾數部分給出有效數字的尾數,因而決定了浮點數的表示精度。二是要給出指數,用整數表示,常稱為階碼,解碼指明小數點在資料中的位置。浮點數也要有符號位。

早期表示:

後來為了方便軟體移植,按IEEE754標準,32位浮點和64位浮點的標準格式位:

  • 不論是32位浮點還是64位浮點,基數 2 是固定常數,每一個浮點數都一樣,所以不用顯示錶示。
  • 32位浮點數中,S是浮點數的符號位,佔一位,在最高位,S = 0表示正數,S = 1表示負數
  • M是尾數,放在低位部分,佔用23位,小數點位置放在尾數域最高有效位的右邊
  • E是階碼,佔用8位,階符采用隱含方式,即採用移碼的方式表示正負指數
  • 浮點數的指數真值e變成階碼E時,應將指數e加上固定偏移值127(01111111),即E = e + 127

注意:浮點數的規格化表示,要求:為了提高資料的表示精度,當尾數的值不為0時,尾數域的最高有效位應為1.

因此,依照規格化後的要求,對於階值E尾碼M有如下範圍:

在IEEE745標準下,一個規格化的32位浮點數X的真值表示為:

其中尾數域所表示的值是1.M。由於規格化的浮點數的尾數域最左位(最高有效位)總是1,故這一位經常不予儲存,而認為隱藏在小數點的左邊。於是用23位欄位可以儲存24位有效數。

同樣的,64位浮點數的區別在於,符號位1位,階碼域11位尾數域52位,指數偏移值1023,e = E - 1023.

機器碼

真值與機器碼相對應,機器數是指:一個數在計算機中的二進位制表示,叫做這個數的機器數。機器數的帶符號的,在計算機用一個數的最高位存放符號,正數為0,負數為1.

而真值,是指沒有符號位內容的值,也就是這個數本身的值(二進位制形式).

對於一個數,計算機要使用一定的編碼方式進行儲存,原碼,反碼,補碼是機器儲存一個具體數字的編碼方式。

原碼

先說原碼,原碼就是符號位加上真值的絕對值,即用第一位表示符號,其餘位表示值。比如8位二進位制:

[+1]原 = 0000 0001 [-1]原 = 1000 0001

第一位是符號位,所以8位二進位制的取值範圍是:

[1111 1111 , 0111 1111]2 即 [-127 , 127]

反碼

反碼的表示方式是:

  • 正數的反碼是其本身
  • 負數的反碼是符號不變,其餘位取反

[+1] = [0000 0001]原 = [0000 0001]反 [-1] = [1000 0001]原 = [1111 1110]反

補碼

補碼的表示方法是:

  • 正數的補碼就是其本身
  • 負數的補碼是在其原碼的基礎上, 符號位不變, 其餘各位取反, 最後+1. (即在反碼的基礎上+1)

[+1] = [0000 0001]原 = [0000 0001]反 = [0000 0001]補 [-1] = [1000 0001]原 = [1111 1110]反 = [1111 1111]補