2016-07-18 42 views
1

對於以下代碼,lval被計算爲VS和gcc上的不同值。對VS和gcc計算的不同值

代碼:

const double val = std::numeric_limits<double>::max(); 
const unsigned long lval = (std::numeric_limits<decltype(val)>::infinity() == val || (static_cast<unsigned long>(val) >= 2)) ? 
    std::numeric_limits<unsigned long>::max() : 
    999; 
cout << lval; 

在Visual Studio中

lval被計算爲999

http://rextester.com/EMFL77801

ON G ++

lval計算出爲18446744073709551615

http://coliru.stacked-crooked.com/a/682c81bbe498ddc5

問題

爲什麼是這兩個值有什麼不同?

此外

我試圖在獨立GCC相同的代碼,並把一個斷點在gdb。我看到static_cast<unsigned long>(val) >= 2評估以true GDB上,但同樣的表達式評估爲在VS

+1

我很確定從浮點到整數類型的轉換會導致後者的結果超出範圍 - 如在'static_cast (val)' - 中展示未定義的行爲。 –

回答

4

§4.9.1浮動積分轉換

浮點類型的prvalue可以轉換爲一個整數類型的prvalue。轉換截斷; 即小數部分被丟棄。 如果目標類型中表示的截斷值不能爲 ,則行爲未定義。

std::numeric_limits<double>::max()無法放入一個unsigned long這樣的行爲是不確定的,而編譯器可以爲所欲爲。

顯然在視覺工作室案例static_cast<unsigned long>(val) >= 2返回false。

-1

false在64但平臺的gcc給出長64位,並視覺工作室給它的32位。