網上看到一道小題:
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,再取結果的整數部分 以此類推,直到...