2017-03-02 229 views
1

我想將time_t的值轉換爲double,然後返回:doubletime_t將time_t轉換爲double和back

在什麼情況下我可能會丟失轉換中的數據?

+1

'time_t'的底層類型是什麼?每個標準都沒有說明。 – NathanOliver

+0

可能的重複http://stackoverflow.com/questions/1848700/biggest-integer-that-c​​an-be-stored-in-a-double – Rene

回答

2

...轉換time_t值加倍,然後回來...
在何種情況下,我可能在轉換丟失數據?

在某些情況下,什麼都沒有。 time_t是一些實數類型。 C11§7.27.13
整數和實數浮點類型統稱爲實數類型。 C11§6.2.517

因此,如果time_tdouble相同,轉換期望沒有損失。

time_t通常表示爲32或64位整數。 Typical double可以精確地對所有53位無符號值(或54位有符號整數值)進行編碼,因此當time_t是32位整數時,不會發生轉換損失。當time_t是64位整數時,轉換爲double開始發生四捨五入,其值在數量級之外。

如果double值來自原始time_t,則第二次轉換後退步驟不應發生任何損失,但如果試圖將任意double更改爲整數,則會產生未定義的行爲。

較不常見,time_t可能是float,long double,long long等,並且類似的問題適用。