对于以下代码,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
的相同表达式
答案 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位。