【发布时间】:2021-04-30 15:10:22
【问题描述】:
我有这个代码:
#include <iostream>
int main() {
double val = -400.0;
const double constVal = -400.0;
std::cout << val << std::endl;
std::cout << static_cast<unsigned>(val) << std::endl;
std::cout << constVal << std::endl;
std::cout << static_cast<unsigned>(constVal) << std::endl;
return 0;
}
当我运行它时,这是输出:
-400
4294966896
-400
0
为什么会这样?适度的谷歌搜索在这件事上没有显示任何内容。
【问题讨论】:
-
啊哈!思考了大约 10 分钟后,我意识到不同之处不在于第二个值是
const,而是(意外地)它也是constexpr。所以第二个强制转换是在编译时计算的,第一个是在运行时计算的。 -
@MooingDuck 这实际上是一个很好的答案,从“UB,鼻恶魔”中得到很好的刷新
-
更好的标题可能是“将负值转换为
unsigned会导致奇怪的行为” -
@SergeyA:这不是答案,因为正确答案是“UB,鼻恶魔”。解释的行为只是一个有趣的旁注。
-
我想,“不是答案”也将是高度特定于编译器和优化级别的。这是一个很好的理论来解释为什么会发生这种情况(对于这个特定的编译器和优化级别的组合)。
标签: c++ constants static-cast