Набор инструментов C ++ VS 141 - 142 отличия для актеров - PullRequest
2 голосов
/ 03 октября 2019

На самом деле я работаю над старым исходным кодом, который использует приведение в стиле 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

Единственный трюк, который я нашел на данный момент, это приведение сначала значения к длинному, а затем к длинному без знака, но это не совсем идеальное решение. !

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Плавающее-интегральное преобразование [conv.fpint]

Значение типа с плавающей запятой может быть преобразовано в значение типа целого числа. Преобразование усекается;то есть дробная часть отбрасывается. Поведение не определено, если усеченное значение не может быть представлено в типе назначения.

0 голосов
/ 03 октября 2019

Как уже было отмечено, приведение отрицательного значения с плавающей запятой к целочисленному типу без знака является неопределенным поведением. Вы говорите

Единственный трюк, который я нашел на данный момент, это приведение сначала значения к long, а затем к unsigned long, но это не совсем идеальное решение!

Да, этонемного громоздко;но это единственный способ добиться четко определенного поведения (в данном случае это фактически поведение, определяемое реализацией).

...