#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
老兄?在谷歌上搜索了一小段时间,却没有发现任何关于这件事的信息。
来自CPPreference.com:
浮点类型的prvalue可以转换为任何整数类型的prvalue。小数部分被截断,即舍弃小数部分。如果值不能放入目标类型,则行为是未定义的(即使目标类型是无符号的,模算术也不适用)。如果目标类型为bool,则这是一个布尔转换(见下文)。
-400不能放入unsigned
中,因此该行为未定义。试图推理任何类型的一致性都是没有用的。
由于这是未定义的行为,编译器在这种情况下可以做任何它想做的事情。通常情况下,他们会做任何可以使其馀的(定义的)行为更容易编码的事情。尽管流行的说法,编译器不太可能使魔鬼飞出你的鼻子,但一个不应该期待任何行为特别。