На самом деле я работаю над старым исходным кодом, который использует приведение в стиле C.
В этом коде мы приводим некоторые двойные значения к unsigned long. Приведение выполняется правильно, когда код скомпилирован с использованием набора инструментов VS2017 v141.
Но теперь мы переходим на набор инструментов VS2019 v142, и приведение не удалось. Возвращает 0xffffffff!
Есть ли изменение в 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 << "\n";
std::cout << "Value : " << value << " - C-Style Cast " << std::hex << ulValue << std::hex << " - Static Cast " << sculValue << "\n";
}
с vs2017 и набором инструментов v141, вывод: Значение: -699457.70832337427 - Cast C-Style 4294267839 - Static Cast 4294267839 Значение: -699457.70832337427 - C-Style Cast fff553bf - Static Cast fff553bf
с vs2019 и набором инструментов v142, выход: значение: -6997 067 297 497 767 497,767 - 7967 C497 - 7676749497- Статическое приведение 4294967295 Значение: -699457.70832337427 - C-Style Cast ffffffff - Статическое приведение ffffffff
Единственный трюк, который я нашел на данный момент, это приведение сначала значения к длинному, а затем к длинному без знака, но это не совсем идеальное решение. !
Заранее спасибо!