在VS和gcc上计算不同的值

时间:2016-07-18 18:13:43

标签: c++ c++11 gcc visual-c++

对于以下代码,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中放置了一个断点。我在gdb上看到static_cast<unsigned long>(val) >= 2评估为true,但在VS中评估为false的相同表达式

2 个答案:

答案 0 :(得分:4)

  

§4.9.1浮动积分转换

     

浮点类型的prvalue可以转换为整数类型的prvalue。转换截断;   也就是说,丢弃小数部分。 如果截断值不可以,则行为未定义   以目的地类型表示。

std::numeric_limits<double>::max()无法放入unsigned long,因此行为未定义,编译器可以执行任何操作。

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

答案 1 :(得分:-1)

在64但是平台gcc给出了长64位,visual studio给它32位。