浮點數在記憶體中的表示移位儲存難點的理解

2021-08-01 19:19:10 字數 3666 閱讀 8347

我們知道,單精度浮點數,在記憶體中是使用32位儲存;那麼這8位組成的新的位元組,我們來用下面的一串數字;00000000;對的,實際上這個就是浮點數冪指數(階碼)的儲存空;首先,我們假設不使用移位儲存(就是大家最頭痛,最;00000000;開始,到;11111111;結束,也就是從0開始到255結束,一共256個.

今天這裡跟大家分享一下對於浮點數在記憶體中冪指數(也有叫階碼的)為何採用移位儲存的這個難點個人的理解,如有錯誤,請大家不吝賜教及時指正不要誤人子弟。 其實關於這個移位儲存的問題真的是第一次從計算機相關的書籍上看到關於浮點數開始就一直困擾著我,直到前天在公車上我無意中想到了問題的關鍵,原因很簡單大家只要多寫出幾個數就明白了,通過浮點數這個移位儲存理解難點的事情,我們應該在今後的學習中養成多問自己幾個為什麼的好習慣,而不是照本宣科,其實無論計算機多麼的高階,畢竟是由人腦發明的,它運算的再快,也是講道理的,所以大家不要知難而退,要迎頭趕上,希望我的這個思路能幫助還在浮點數移位儲存為什麼中迷茫的同學們一點兒啟示,謝謝大家,祝大家學習工作愉快,努力學好科學文化知識,爭做祖國的棟梁之材。廢話不多說了,請看下面:

我們知道,單精度浮點數,在記憶體中是使用32位儲存的,並且後23位(整串32位數的低位)作為表示「尾數」來使用的,那麼32-23=9位,這9位(整串32位數中的高位)中最左邊的第一位(整串32位數中的最高一位)是用來表示這個浮點數的正負的,那麼9-1=8位,正好是乙個位元組的長度(請注意這裡雖然是正好是乙個位元組的長度,但是實際上這8位並不在順序中的同乙個位元組內,因為整串32個位數最高位用來表示浮點數的正負,這8位是由整串32位數中左數第乙個即最高的那個位元組的後7位,加上左數第二個位元組的第一位合體組成的),而且移位儲存就是使用了這8個位組成的新的位元組。所以我們可以先忽略整串32位數最高一位(最左邊的那一位)和低23位(即整串32位數從右邊數23位),只考慮由整串32位數的左數第乙個位元組的後七位和整串32位數的左數第二個位元組的最高位(左數第一位)一同組成的新8位的這個位元組,排除干擾,我們的問題就清晰,容易理解多了。

那麼這8位組成的新的位元組,我們來用下面的一串數字表示,這個新位元組最後一位因為實際上是整串32位數左數第二個位元組的最高位(左數第一位),因此我們使用乙個空格來隔開它,這樣大家看的更清楚直觀一些,請看。

0000000 0

對的,實際上這個就是浮點數冪指數(階碼)的儲存空間,那麼它能表示多少個數,或者說能表示多大的數呢,我們接著來看一下。

首先,我們假設不使用移位儲存(就是大家最頭痛,最難理解的,本文的核心)技術,而是單單看看這個 7位+1位組成的新位元組,到底能表示多少個數,這個問題就太簡單了,我想大家閉著眼睛都能查出來,沒錯是從

0000000 0

開始,到

1111111 1

結束,也就是從0開始到 255結束,一共 256個數。

但是,我們知道這新組成的8位數是用來表示整串32位單精度浮點數的冪指數(階碼)的,而浮點數的冪指數(階碼)是有必要使用負數的,大家都知道,當冪指數(階碼)為正時,整

串32位單精度浮點數的小數點是向右移動的,表示的數的絕對值就大一些,同樣我們在使用計算機時也需要使用到絕對值很小的數,因此,我們需要將整串32位數的小數點向左移動,從而將整串32位單精度浮點數的絕對值變的更小,那麼就需要冪指數(階碼)為負數,好了,我們接下來看。

既然這個新生成的位元組,既要表示正數,又要表示負數,因此我們要拿出一位來表示正負號,而且大家都知道,一般都是拿乙個字串最左邊的那位即最高位來表示正負號的,因此,我們也沿襲這個規矩,其實這個也很好理解,因為這個新位元組表示的是乙個範圍內的數,因此,最右一位是一直在變化的,而最高位(最左邊那位)一般只有兩個狀態當為0時,剩下的7位可以表示的範圍從0到127,當最高位(最左邊那位)為1時,配合剩下的7位可以表示128到255,當然這裡我們還是把這新位元組的8位都用來表示數,而沒有拿出1位來表示符號。

好的,既然我們拿出這個新位元組的最高位(最左邊的那位)來當符號位,而且看來很合適,那麼我們來看看這個符號位,是用1來表示負數(常規做法)好不好,合理不合理。

首先,我們使用傳統的方式,即乙個位元組的最高位(最左邊那位)為1時表示負數,那麼我們可以得到兩個區間,這裡我們為了看著方便還是使用空格來隔開最高位的符號位和最低位的那位特殊位:

第乙個區間:

0 000000 0~ 0 111111 1

即+ 0 到 127,

第二個區間:

1 000000 0~ 1 111111 1

即 -0 到 - 127,

大家看到這裡發現問題了,怎麼有兩個零,乙個正零,乙個負零呢,好啦,我們再馬上來看看使用移位儲存方式會有什麼效果,我們知道移位儲存我們要加 127,為什麼要加127,大家看看下面的例子就明白了,請看:

127 使用這個新生成的位元組來表示,則是:

0 111111 1 ,

我們來多舉幾個例子,大家馬上就明白了,請看:

如果我們要表示 0,則有 0+127=127 即 0 111111 1

:0 000000 0 + 0 111111 1= 0 111111 1

我們要表示1,則有 1+127=128 即 1 000000 0

:0 000000 1 + 0 111111 1= 1 000000 0

我們要表示 2,則有 2+127=129 即 1 000000 1

:0 000001 0 + 0 111111 1= 1 0000001

………………………………………………………………

我們要表示 128,則有 128+127=255 即 1 111111 1

:1 000000 0+ 0 111111 1= 1 111111 1

這個128是我們能夠使用 8位二進位制移位儲存演算法表示的最大的正數了,再大就溢位了。 同樣,我們來看看負數:

我們要表示 -1時,則有( -1) +127=127-1=126 即 0 111111 0

:0 111111 1 - 0 000000 1= 0 111111 1

我們要表示 -2時,則有( -2)+ 127=127-2=125 即 0 111110 1

:0 111111 1 - 0 000001 0= 0 111110 1

……………………………………………………………………………………………… 我們要表示 -127時,則有(-127)+127=127-127=0 即 0 000000 0

:0 111111 1 - 0 111111 1= 0 000000 0

這-127,是我們能夠使用 8位二進位制採用移位儲存所能表示的最小的負數了,再小就溢位。

由上面的 7個例子,我們可以得出規律,採用移位儲存技術,我們可以使用 8位二進位制來表示從 -127~128 共計 127個負數+零(0)+128個正數總共 256個數,看來使用移位儲存即沒有+0和-0的問題,又充分的使用這個新生成的 8位二進位制數來最大限度的表示單精度浮點數的冪指數(階碼),是非常合理的,只是這裡大家需要注意,在使用移位儲存技術時,得到的兩個區間:

0 000000 0~ 0 111111 1

這裡不嚴謹的稱之為 0區間,在0區間內表示 -127~0 ,0包含在此區間。

0 000000 0表示的是 -127 而不是0,

0 111 111 1表示的是0 而不是 +127,

1 000000 0~ 1 111111 1

這裡我們稱之為 1區間,在1區間內表示的是 1~128,

所以,在使用移位儲存技術的時候,這個8位新位元組中最高位的符號位是1,表示的是正數,而當最高位的符號位是0時,表示的是0 和負數的集合。

綜上所述,就是個人對浮點數冪指數(階碼)移位儲存知識點的理解,請大家批評指正,希望能幫助到更多想通過自己的努力來改變命運的莘莘學子們,加油。

浮點數在記憶體中的表示

c語言的float對應單精度浮點數,由1位符號 8位指數 23位尾數組成 尾數部分是二進位制小數,那23位是小數點後面的部分,小數點前面還有個隱含的1並不儲存 二進位制小數和十進位制小數道理一樣,只是基數變成2 比如十進位制的3.14 3x10 0 1x10 1 4x10 2 3 1 10 4 10...

浮點數在記憶體中的表示

printf f 5 printf d 5.01 輸出結果為 0.000000,乙個大數的原因。原因 int型讀成了double型 printf函式自動將float型轉化為double 就發生記憶體訪問越界,讀出非常小的數 float型讀成int型,就變成非常大的數了。2進製 10進製 對於大小為3...

浮點數在記憶體中的表示

浮點數在記憶體中的表示 c語言 浮點數在記憶體中的表示 單精度浮點數 1位符號位 8位階碼位 23位尾數 雙精度浮點數 1位符號位 11位階碼位 52位尾數 實數在記憶體中以規範化的浮點數存放,包括數符 階碼 尾數。數的精度取決於尾數的位數。比如32位機上float型為23位 double型為52位...