2016-07-18 5 views
1

次のコードでは、lvalはVSとgccで異なる値に計算されます。VSとgccで異なる値が計算される

コード:Visual Studioの

lval

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; 

はG上の999

http://rextester.com/EMFL77801

と計算された++

lvalが18446744073709551615

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

質問

と計算されたのはなぜこれら2つの値が異なっていますか?

さらに

私は、スタンドアロンのgccで同じコードを試みたが、GDBでブレークポイントを置きます。私はstatic_cast<unsigned long>(val) >= 2は、GDBにtrueに評価されたことを見たが、同じ式は64が、プラットフォームのgccで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ビット長を与え、およびVisual Studioはそれを32ビットを提供します。

関連する問題