計算機組成原理,浮點數的表示以及對其範圍的理解
昨天為了理解規格化浮點數的範圍這個東西查了各種各樣的部落格花了很長時間,在這裡記錄一下。
首先數在機器裡有四種表示方式:
原碼,反碼,補碼和移碼(增碼)
舉一個例子:
對於一個
八位正數
,最高位為符號位,比如
01001001
那麼它的各種表示如下:
原碼: 01001001
反碼: 01001001
補碼: 01001001
移碼: 11001001
(加上
, 也就是數值位與補碼相同,符號位取反)
對於一個八位負數,最高位為符號位,比如
11001001
那麼它的各種表示如下:
原碼: 11001001
反碼: 10110110
補碼: 10110111
(反碼+1)
移碼: 00110111
定點資料表示
仍以八位資料為例,最高位代表符號位
對於定點整數而言
原碼
表示數的範圍如下所示:
其中,最大正數是
(
是
10000000
,減1後為
01111111
)
最小正數是1
最大負數是-1
最小負數是
在這個
數軸
上,0的表示有兩種+0和-0
補碼
表示數的範圍如下所示:
其中,正數表示範圍不變,最大正數是
最小正數是1
最大負數也沒變,是-1
最小負數是
(這一點非常重要!
0只有一種表示方式,並且把-0向左移動用來表示負數的最小值
所以以補碼為例,定點整數可表示的範圍是
~
對於定點小數而言
先是原碼,表示資料如下:
其中,最大正數為
(
0。1111111 + 0。0000001 = 1。0000000
)
最小正數為
0的表示仍然有兩種
最小負數為
最大負數為
補碼錶示資料如下:
正數不變,最大正數為
(
0。1111111+0。0000001 = 1。0000000
)
最小正數為
0的表示一種,-0向左移動用來表示負數的最小值
最小負數為-1
最大負數為
所以以補碼為例,定點小數的可表示範圍是-1~
浮點資料表示
對於定點整數而言由於
小數點
固定,那麼在字長一定的情況下就限制了可以表示數的範圍和精度,所以就引出了浮點資料表示
浮點數表示法是指以適當的形式將比例因子表示在資料中,讓小數點的位置根據需要而浮動。這樣,在位數有限的情況下,既擴大了數的表示範圍,又保持了數的有效精度。
一般格式表示(非規格化)
階碼數值位數為m, 尾數數值部分位數為n
數的真值
:階碼的底,通常為
:階碼數值,決定數的範圍
:
尾數
,決定數的符號和精度
在這裡可以用科學計數法來理解,比如
舉個例子:
非規格化的範圍:
數的真值
:階碼的底,通常為
:階碼數值,決定數的範圍
:尾數,決定數的符號和精度
原碼錶示:以八位資料為例,4位表示階碼,4位表示尾數
對於正數而言
:E最大值為
(
位二進位制數最大值是每一位都是1,表示的數是
、而不是
),
0111
E最小值為
,
1111
W最大值為
,
0。111
W最小值為
,
0。001
所以N最大值為:
,
01110111
N的最小值為
,
11110001
對於負數而言
:E最大值為
,
0111
E最小值為
,
1111
W最大值為
,
1。001
W最小值為
,
1。111
所以N最大值為:
,
11111001
N的最小值為
,
01111111
補碼錶示:以八位資料為例,位表示階碼,位表示尾數
對於正數而言
:E最大值為
(m位二進位制數最大值是每一位都是1,表示的數是
、而不是
),
0111
E最小值為
,
1000
W最大值為
,
0。111
W最小值為
,
0。001
所以N最大值為:
,
01110111
N的最小值為
,
11110001
對於負數而言
:E最大值為
,
0111
E最小值為
,
1000
W最大值為
,
1。111
W最小值為
,
1。000
所以N最大值為:
,
11111001
N的最小值為
,
01111111
一般格式表示(規格化)
首先來看看什麼是規格化。
規格化指的是:尾數的數值位最高位必須是一個有效值
什麼意思捏?
也就是在原碼下尾數必須是
0。1XXX。。。XXX
這種形式,並且當尾數不是這種形式時必須對其進行移位處理且伴隨著階碼的改變。
比如:
左規:尾數算術左移1,階碼減1
右規:浮點數的結果出現溢位,將尾數右移1,階碼加1
可以用
十進位制
的科學計數法來理解這個東東。
辣麼問題來咯:
對於規格化的浮點數,以原碼形式儲存,它表示的範圍是什麼捏???
數的真值
:階碼的底,通常為
:階碼數值,決定數的範圍
:尾數,決定數的符號和精度
原碼錶示:以八位資料為例,4位表示階碼,4位表示尾數
對於正數而言
:E最大值為
(m位二進位制數最大值是每一位都是1,表示的數是
而不是
),
0111
E最小值為
,
1111
W最大值為
,
0。111
W最小值為
,
0。100
所以N最大值為:
,
01110111
N的最小值為
,
11110100
對於負數而言
:E最大值為
,
0111
E最小值為
,
1111
W最大值為
,
1。100
W最小值為
,
1。111
所以N最大值為:
,
11111000
N的最小值為
,
01111111
再進一步,以補碼形式儲存呢?其範圍又是多少呢?(這個問題想了好久)
以補碼形式儲存的尾數
對於正數,規定必須是
0。1XXXXX。。X
這種形式
對於負數,規定必須是
1。0XXXXX。。X
這種形式
記住上面兩種規定,理解的偏差就在此處
數的真值
:階碼的底,通常為
:階碼數值,決定數的範圍
:尾數,決定數的符號和精度
補碼錶示:以八位資料為例,4位表示階碼,4位表示尾數
對於正數而言
:E最大值為
(m位二進位制數最大值是每一位都是1,表示的數是
,而不是
),
0111
E最小值為
,
1000
, 注意此處補碼錶示的範圍擴大了
W最大值為
,
0。111
W最小值為
,
0。100
所以N最大值為:
,
01110111
N的最小值為
,
10000100
對於負數而言
:E最大值為
,
0111
E最小值為
,
1000
注意此處補碼錶示的範圍擴大了
W最大值為
,
1。011
其原碼為
1。101
W最小值為
,
1。000
,此處由於是補碼,所以範圍擴大
!!!!!重點來了,為什麼W的最大值是這樣呢???,為什麼不是
捏??
注意我上面對負數補碼尾數的規定:對於負數,規定必須是1.0XXXXX..X這種形式,如果原碼是1.100,它取補後的結果還是1.100也就不滿足1.0XXXXX..X這種形式了
,所以
要想取補後是
1。0XXXXX。。X
那麼原碼必須是
1。1XXXXX。。X
這樣
由於·
1。100000。。0
取補後仍為其本身,所以它不能當作最大的負尾數
所以最大的負尾數為
1。10000。。。1
,取補後為
1。0111111。。。1
所以N最大值為:
,
10001011
的最小值為
,
01111000
(有錯誤歡迎在評論區指出!)
參考:
計算機組成浮點數補碼規格化負數表示範圍
負數補碼錶示範圍以及規格化數
浮點數所表示的數值範圍
定點數與浮點數(小數)
浮點數的表示 —— 基本格式、規格化、表示範圍
華中科技大學
計算機組成原理MOOC