假設有乙個浮點數 float fl = 3.14159267 (和圓周率很像啊),它在計算中的是怎樣儲存的呢?
步驟1:轉換為二進位制表示,浮點數分為整數部分和小數部分,對於該浮點數來說,整數部分為3,浮點數部分為0.14159267.
這裡假設fl是4個位元組,32位浮點數表示.
十進位制 二進位制
3【0000,0011】
0.14159267【0010,0100,0011,1111,0110,1010,11】(小數點部分)
先說說32 位的 float型. 乙個浮點數 x, 在計算機中表示為:
x = a * 2^e
這裡a表示尾數,e表示指數,在計算機內部,都是用二進位制來表示的,a使用二進位制的科學法來表示,科學表示法第一位總是1,所以第一位忽略不計,e表示的時候,因為要表示出負數,加上127,實際運算的時候要減去127.
ieee規定,32位float型被拆分所形成的格式如下,左邊為高位:
符號位(0為正,1為負) 指數字 尾數字
最高位32位 第31~24位 第23~1位
【0000,0000】【0000,000 0000,0000 0000,0000】
所以fl的二進位制科學法表示就為:
11.0010,0100,0011,1111,0110,1010,11 * 2^0,進一步表示為:
1.1001,0010,0001,1111,1011,0101,011 * 2^1
那麼,注意1.1001第乙個1要去掉(科學計數法),所以成了1001,指數部分為1,加上127就是128,二進位制就是1000,0000,這樣指數部分就表示完成,符號位因為是正數,所為為0,下面就剩下尾數部分,根據上面的定義:符號位佔1位,指數部分佔8位,尾數部分佔23位.
於是可以表示為:
0 1000,0000 1001,0010,0001,1111,1011,010 (11,這兩個分別是尾數部分24,25位,因為擷取的是前23位)
(注意: 浮點數 0.0 在計算機中表示為 0x 00 00 00 00)
二進位制進製(從高位到低位)表示為:
0100,0000 0100,1001 0000,1111 1101,1010 (取到32位)
十六進製制(從高位到低位)表示為:
40 49 0f da
在小段機器上表示應該為:da of 49 40
但是實際上在vs2010中產看結果卻為:
首位是 db,而不是da,當時計算好長時間,原來這裡有乙個說明(關於擷取位的說明)
在擷取尾數部分第23位數時,第24位為1,那麼就應該進製,所以第23位就變成1,這樣就由 da變為 db,為題出現在進製上,在這裡卡好半天,看文章也看到這個知識點,但是真是自己動手算,這些細節總是會忽略,知易行難,動手吧!
形象化描述
關於移碼
浮點數表示
之前的一些工作當中碰到了很多有關浮點數的問題,比如浮點數的表達範圍 表達精度 浮點數的儲存方式 浮點數的強制型別轉換等等,因此感覺有必要系統了解一下有關浮點數的問題。浮點數是一種公式化的表達方式,用來近似表示實數,並且可以在表達範圍和表示精度之間進行權衡 因此被稱為浮點數 浮點數通常被表示為 n m...
計算機浮點數 float 表示
這篇文章講得比較淺顯易懂,所以轉一下。必須對計算機原理的原碼 反碼 補碼 移碼有個清晰的認識,另外參考一下ieee754,否則也會有不明白的地方。括號內為本人看法或觀點。我想浮點數的實現與編譯器也會有很大關係的。前兩天仔細看了看,覺得研究計算機如果不說說如何表示浮點數就太不厚道了.很多人也寫過,這裡...
計算機浮點數 float 表示
2007 09 09 17 07 3674人閱讀收藏 舉報 先說說32 位的 float型.乙個浮點數 x,在計算機中表示為 x a 2 e 這裡 e 代表指數,a 代表尾數,在 計算機內部,他們都是用二進位制表示的.其中a 用二進位制的科學表示法 表示,由於科學表示法第一位總是1 0除外 所以第一...