問題

私は実際にc-styleキャストを使用する古いソースコードに取り組んでいます。

このコードでは、いくつかのdouble値をunsigned longにキャストします。コードがVS2017 toolset v141でコンパイルされたときにキャストが正しく実行されます。

しかし今、VS2019ツールセットv142に移行しており、キャストに失敗しました。 0xffffffを返します!

キャストに影響を与えるv142の変更はありますか? はいの場合、正しい値を持つためにできるオプションやトリックはありますか?

例えば:

 #include <iostream>
#include <limits>

typedef std::numeric_limits< double > dbl;

int main()
{
    double value = -699457.70832337427;
    unsigned long ulValue = (unsigned long)value;
    unsigned long sculValue = static_cast<unsigned long>(value);

    std::cout.precision(dbl::max_digits10);

    std::cout << "Value : " << value << " - C-Style Cast " << ulValue << " - Static Cast " << sculValue << "
";
    std::cout << "Value : " << value << " - C-Style Cast " << std::hex << ulValue << std::hex << " - Static Cast " << sculValue << "
";
}
 

VS2017とtoolset v141を使用すると、出力は次のようになります。 値:-699457.70832337427 - Cスタイルキャスト4294267839 - 静的キャスト4294267839 値:-699457.70832337427 - Cスタイルキャストff553bf - 静的キャストff555bf

vs2019とtoolset v142では、出力は次のようになります。 値:-699457.70832337427 - Cスタイルキャスト4294967295 - 静的キャスト4294967295 値:-699457.70832337427 - Cスタイルキャストffffff - 静的キャストfffffff

私が今見つけた唯一のトリックは、最初に値をlongとunsigned longにキャストすることですが、それは本当に理想的な解決策ではありません!

前もって感謝します!

  ベストアンサー

フローティング積分変換[conv.fpill]

浮動小数点型の実数値を整数型のprvalueに変換することができます。変換は変換されます。つまり、小数部分は破棄されます。切り捨てられた値を宛先型で表現できない場合、動作は未定義です。

  同じタグがついた質問を見る

c++casting