2010-07-26 115 views
6

在我的平臺上這個打印9223372036854775808.安全轉換

double x = 1e19; 
std::cout << static_cast<unsigned __int64>(x) << '\n'; 

我試過Boost.NumericConversion,但得到了同樣的結果。

x拆分成2個相等部分,然後將轉換後的一半加在一起給出正確的結果。但我需要一個通用的解決方案來使用模板代碼。

預先感謝您。

編輯: 此問題出現在Visual Studio 2008上,但不是MinGW。將4.0e9轉換爲無符號長工作正常。

回答

10

似乎它適用於gcc,但它在Visual Studio中存在問題。見Microsoft's answer關於這個問題:

我們浮點到整數 轉換總是做一個 符號整數。在這個特定的 的情況下,我們使用FIST指令,其中 如您所描述的那樣生成800..00。 因此,沒有定義的 行爲轉換爲無符號的 64位整數值,它們是大於最大64位有符號整數 的 。

所以,你只能轉換數字在符號的64位整數的範圍:-9,223,372,036,854,775,808到+9,223,372,036,854,775,807(-2^63〜2^63-1)。

1

您的編譯器的行爲不符合C99,它要求正值應該總是正確轉換,如果可能的話。它只允許偏離負值。

的remaindering操作中執行 當整數類型的值是 轉換爲無符號類型不必是 執行時實 浮動類型的值轉換爲無 類型。因此,便攜式實數 浮點值的範圍是(-1,Utype_MAX + 1)。

對於你的模板代碼,你可能只是測試你的值是否大於static_cast<double>(UINT64_MAX/2),並做你已經在做的修復工作。如果這隻涉及對常量的測試,則應該在不相關的地方對其進行優化。