C++ C++;VS工具集141-142铸件的差异
实际上,我正在编写一个使用c样式转换的旧源代码 在该代码中,我们将一些双精度值转换为无符号long。当使用VS2017工具集v141编译代码时,转换是正确的 但是现在,我们正在迁移到VS2019工具集v142,而强制转换失败了。它返回0xFFFFFF v142中是否有影响演员阵容的变化? 如果是,是否有一个选项或任何技巧,我可以做有正确的价值 例如:C++ C++;VS工具集141-142铸件的差异,c++,casting,C++,Casting,实际上,我正在编写一个使用c样式转换的旧源代码 在该代码中,我们将一些双精度值转换为无符号long。当使用VS2017工具集v141编译代码时,转换是正确的 但是现在,我们正在迁移到VS2019工具集v142,而强制转换失败了。它返回0xFFFFFF v142中是否有影响演员阵容的变化? 如果是,是否有一个选项或任何技巧,我可以做有正确的价值 例如: #include <iostream> #include <limits> typedef std::numeric_l
#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";
}
#包括
#包括
typedef std::数值_限制dbl;
int main()
{
双值=-699457.70832337427;
无符号长ulValue=(无符号长)值;
无符号长循环值=静态_转换(值);
标准::计算精度(dbl::最大数字10);
标准::cout
浮点整数转换[conv.fpint]
浮点类型的prvalue可以转换为整数类型的prvalue。转换会截断;也就是说,小数部分将被丢弃。如果目标类型中无法表示截断的值,则行为未定义
正如已经指出的,将负浮点值转换为无符号整数类型是未定义的行为
目前我发现的唯一技巧是先将值强制转换为long,然后将值强制转换为unsignedlong,但这并不是一个理想的解决方案
是的,这有点麻烦;但这是实现定义良好的行为(在本例中实际上是实现定义的行为)的唯一方法.您正在对unsigned long强制转换负的双精度值?这有意义吗?无法重现此问题。使用v142工具集生成的结果与V141中列出的结果相同。我看到了Ok的可能副本。依赖未定义行为的未知意图代码在许多计算机上运行,我们正忙于让它继续运行快跑。我相信我们的未来掌握在好的手中。我们在谈论什么样的机器?找一个朋友。该死,这不是我一直在等待的答案,但我现在知道我必须做什么了!谢谢大家!