十進位制浮點數的二進位制轉換及儲存

2021-07-15 05:25:33 字數 2462 閱讀 2985

網上看到一道小題:

int main(void) 

輸出結果a,b均為0。

這道小題是乙個很好的面試題,考查面試者對浮點數儲存的理解。

十進位制小數的二進位制表示:

整數部分:除以2,取出餘數,商繼續除以2,直到得到0為止,將取出的餘數逆序

小數部分:乘以2,然後取出整數部分,將剩下的小數部分繼續乘以2,然後再取整數部分,一直取到小數部分為零為止。如果永遠不為零,則按要求保留足夠位數的小數,最後一位做0舍1入。將取出的整數順序排列。

舉例:22.8125 轉二進位制的計算過程:

整數部分:除以2,商繼續除以2,得到0為止,將餘數逆序排列。

22 / 2  11 餘0

11/2     5  餘 1

5  /2      2  餘 1

2  /2      1  餘 0

1  /2      0  餘 1

得到22的二進位制是10110

小數部分:乘以2,取整,小數部分繼續乘以2,取整,得到小數部分0為止,將整數順序排列。

0.8125x2=1.625取整1,小數部分是0.625

0.625x2=1.25取整1,小數部分是0.25

0.25x2=0.5取整0,小數部分是0.5

0.5x2=1.0取整1,小數部分是0,

得到0.8125的二進位制是0.1101

結果:十進位制22.8125等於二進位制00010110.1101

浮點數的計算機儲存:

ieee 754標準中所定義的單精度32位浮點數和雙精度64位浮點數的格式:

單精度二進位制小數,使用32位儲存。

1 8 23 位長

+-+--------+-----------------------+

|s| exp | fraction |

+-+--------+-----------------------+

31 30 23 22 0 位編號 (從右邊開始為0)

偏正值 +127

雙精度二進位制小數,使用64位儲存。

1 11 52 位長

+-+--------+-----------------------+

|s| exp | fraction |

+-+--------+-----------------------+

63 62 52 51 0 位編號 (從右邊開始為0)

偏正值 +1023

單精度的e為指數值+127,雙精度的e為指數值+1023,ieee標準要求浮點數必須是規範的,也就是說尾數的小數點左側必須為1,因此在儲存尾數時可以省略小數點左側的1,這樣實際上對於float型別我們是用了23bits表示了24bits尾數。

以32位單精度浮點數為例:

十進位制22.8125轉換為二進位制表示為00010110.1101,

00010110.1101 = 1.01101101 * 2^4

由此得出 符號位s為0,表示正數

指數字e為4+127=131d=10000011b

尾數f為1.01101101去掉小數點左側的1,即為01101101

這樣十進位制22.8125轉換為二進位制表示為00010110.1101,計算機儲存為01000001101101101000000000000000

010000011

01101101000000000000000

1bit

8bits23bits

s

e

f

符號位

指數字尾數字

回頭再看最開始的小題,就容易多了。

10.0的二進位制表示為1010.0= 1.010*2^3

float型別的10.0:

符號位s為0

指數e為3+127=130=10000010

尾數f為010

double型別的10.0:

符號位s為0

指數e為3+1023=1026=10000000010

尾數f為010

最終結果:

float型別的10.0轉換為二進位制為1010.0儲存形式為01000001001000000000000000000000,16進製表示為0x41200000

double型別的10.0轉換為二進位制為1010.0儲存形式為0100000000100100後面用0補全

,16進製表示為0x40240000

**驗證一下:

int main(void) 

輸出結果:

$ ./a.out

041200000

40240000

十進位制浮點數轉換為二進位制

浮點數儲存 浮點數在計算機中儲存也是以二進位制的形式,遵循ieee二進位制算數標準 格式為 float 符號位 首位 指數字 8位 尾數 23位 double 符號位 首位 指數字 11位 尾數 52位 十進位制浮點數轉換為二進位制 方法 整數部分 除以2,取出餘數,商繼續除以2,直到得到0為止,將...

十進位制二進位制轉換

一 整形裝換成兩個位元組 int value 456 unsigned char byte1 value 0xff00 8 高8位 unsigned char byte2 value 0xff 低8位 nslog byte1 x byte2 x byte1,byte2 byte1 1 byte2 c...

十進位制二進位制轉換

1.十進位制轉二進位制 正整數轉二進位制 除二取餘,然後倒序排列,高位補零 負整數轉二進位制 先是將對應的正整數轉換成二進位制後,對二進位製取反,然後對結果再加一。小數轉換二進位制 對小數點以後的數乘以2,取結果的整數部分 不是1就是0嘍 然後再用小數部分再乘以2,再取結果的整數部分 以此類推,直到...