gpt4 book ai didi

c++ - 在 VS 和 gcc 上计算的不同值

转载 作者:行者123 更新时间:2023-11-30 02:30:34 26 4
gpt4 key购买 nike

对于以下代码lval在 VS 和 gcc 上被计算为不同的值。

代码:

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;

在 Visual Studio 上

lval计算为999

http://rextester.com/EMFL77801

在 g++ 上

lval计算为 18446744073709551615

http://coliru.stacked-crooked.com/a/682c81bbe498ddc5

问题

为什么这两个值不同?

进一步

我在独立的 gcc 中尝试了相同的代码,并在 gdb 中放置了一个断点。我看到了 static_cast<unsigned long>(val) >= 2评估为 true在 gdb 上,但相同的表达式计算为 false在VS中

最佳答案

§ 4.9.1 Floating-integral conversions

A prvalue of a floating point type can be converted to a prvalue of an integer type. The conversion truncates;that is, the fractional part is discarded. The behavior is undefined if the truncated value cannot berepresented in the destination type.

std::numeric_limits<double>::max()无法放入 unsigned long所以行为是未定义的,编译器可以做任何它想做的事。

显然在 visual studio 案例中 static_cast<unsigned long>(val) >= 2返回 false。

关于c++ - 在 VS 和 gcc 上计算的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38443403/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com