範了一個很鬱悶的錯誤

一直以來,用到64位數時,在time_t, __int64 和 double 之間用強轉運算,

從來也沒有發現有什麼不妥,今天發現,原來自己漸漸的淡化了 浮點數 類型的內存分佈機制。

以下給以說明: C/C++的浮點數據類型有float和double兩種。

 

 類型float大小爲4字節,即32位,內存中的存儲方式如下:

符號位(1 bit) 指數(8 bit) 尾數(23 bit)

 

 類型double大小爲8字節,即64位,內存佈局如下:

符號位(1 bit) 指數(11 bit) 尾數(52 bit)

 

符號位決定浮點數的正負,0正1負。

 

指數和尾數均從浮點數的二進制科學計數形式中獲取。

如,十進制浮點數2.5的二進制形式爲10.1,轉換爲科學計數法形式爲(1.01)*(10^1),由此可知指數爲1,

尾數(即科學計數法的小數部分)爲01。

 

根據浮點數的存儲標準(IEEE制定),

float類型指數的起始數爲127(二進制0111 1111),

double類型指數的起始數爲1023(二進制011 1111 1111),

 

在此基礎上加指數,得到的就是內存中指數的表示形式。尾數則直接填入,如果空間多餘則以0補齊,如果空間不夠則0舍1入。所以float和double類型分別表示的2.5如下(二進制):

符號位        指數                       尾數

0               1000 0000            010 0000 0000 0000 0000 0000

0               100 0000 0000     0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

文章出處:http://www.diybl.com/course/3_program/c++/cppsl/2008629/129103.html

發佈了27 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章