次のコードでは、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
'static_cast(val)'のように、範囲外の結果を生成する浮動小数点から整数型への変換は、未定義の動作を示しています。 –