c++中浮點數的儲存方式
最近閒來無事,一直搞不懂float型別在記憶體中是怎麼儲存的,於是潛心研究了一下,以下是一些心得:
開始之前,先簡單的說一下float的四位元組32位二進位制分別代表的意義:
1:符號位 0正1負
2->9:階碼 0111 1111
10->32:尾碼 其實就是小數點移動後,去掉左邊1剩餘的數(這兒可能說的不是很清晰,後面我會舉例說明,很容易理解的)
以上三個名字其實不重要,理解它們所代表的含義即可,下面開始正題:
我這兒以12.25為例說明浮點數在記憶體中的儲存方式
1.首先將12.25轉換為二進位制12.25->1100.01(其餘各位用0填充,這兒為了清晰起見,就省略了)
2.移動小數點,例如12.25移動後為1.10001,去掉小數點左邊的1,剩餘的即為偽碼.但是這兒由出現了乙個新的問題,我們怎麼區分小數點的左移和右移呢,編譯器在這兒採用了乙個非常巧妙的方法,利用127進行區分,如果小數點向左移動,就加上127,向右移動就減去127,即左加右減.這樣就可以區分了...可能這兒說的還不是很清楚,下面會有我寫的圖示.
0 0111 1111->階碼 0
0000 0011
1000 1000 0000 0000 0000 0000 //藍色為符號位,紅色為移碼(12.25在這兒左移了三位),綠色為偽碼
0 1000 0010 1000 1000 0000 0000 0000 0000//利用上面的左加右減得出 這就是浮點數在記憶體中的儲存方式
即0100 0001 0100 0100 0000 0000 0000 0000,轉換成十六進製制即為0x41440000(這塊都是0,對結果沒影響,如果不是0,就會有誤差,這也就可以解釋為什麼浮點數只是一種近似儲存方式)
我們在編譯器中對其進行驗證...
經過驗證結果是正確的...
同理我們知道浮點數1.0在記憶體中的儲存方式為0x3f800000 大家可以自行驗證
double型別同理,大家可以自己試試...
c 中浮點數的儲存方式
c 中浮點數的儲存方式 最近閒來無事,一直搞不懂float型別在記憶體中是怎麼儲存的,於是潛心研究了一下,以下是一些心得 開始之前,先簡單的說一下float的四位元組32位二進位制分別代表的意義 1 符號位 0正1負 2 9 階碼 0111 1111 10 32 尾碼 其實就是小數點移動後,去掉左邊...
C語言浮點數儲存方式
對於浮點型別的資料採用單精度型別 float 和雙精度型別 double 來儲存,float資料占用32bit,double資料占用64bit.其實不論是float型別還是double型別,在計算機記憶體中的儲存方式都是遵從ieee的規範的,float 遵從的是ieee r32.24 而double...
C語言浮點數儲存方式
對於浮點型別的資料採用單精度型別 float 和雙精度型別 double 來儲存,float資料占用 32bit,double資料占用 64bit.其實不論是float型別還是double型別,在計算機記憶體中的儲存方式都是遵從ieee的規範的,float 遵從的是ieee r32.24 而doub...