今天群裡面的朋友提了乙個問題,float在記憶體中是如何表示的。這看似乙個很簡單的問題,但我確一時不知道該怎麼表示。忘得不能再忘了,看到別人寫了乙個很好的文章,ctrl+c過來慢慢體會!
根據ieee的標準,浮點數的定義如下
我們以單精度浮點數來說明:
符號位,表述浮點數的正或者負
指數實際也有正負的,但是沒有單獨的符號位,而是採用了乙個偏移來表示
在計算機的世界裡,進製都是二進位制的,指數表示的也是2的n次冪
這個資料格式當中的,指數是8位,可表達的範圍是0到255
而對應的實際的指數是-127到+128
這裡特殊說明,-127和+128這兩個資料在ieee當中是保留的用作多種用途的
-127表示的數字是0
128和其他位數組合表示多種意義,最典型的就是nan狀態
小數部分,並不是乙個浮點數的實際的小數
實際的小數在這個小數前面還保留了乙個1
拿浮點數1.0來說
符號位是0, 實際指數是0,對應這裡的指數就是127了,也就是0x7f
而小數部分就是1.0了, 1是暗含的不儲存,實際的小數部分就是0了
因此組合起來的資料就是,0x3f80000
234.0用float型別表示時使用4位元組儲存,內容是 0x436a0000。
換成二進位制表示為0 10000110 11010100000000000000000,
其中符號為0,指數為10000110,有效數字為11010100000000000000000。
指數換成10進製為134,減去127為7。
有效數字其實是小數部分,加上省略的整數部分1為 1.110101,將小數點向右移7位就相當於乘以2的指數次冪,
即11101010,換成10進製為234。
浮點數在記憶體中的表示
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位...