提问者:小点点

将常量double强制转换为无符号会导致0,而非常量double则很好


#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

老兄?在谷歌上搜索了一小段时间,却没有发现任何关于这件事的信息。


共1个答案

匿名用户

来自CPPreference.com:

浮点类型的prvalue可以转换为任何整数类型的prvalue。小数部分被截断,即舍弃小数部分。如果值不能放入目标类型,则行为是未定义的(即使目标类型是无符号的,模算术也不适用)。如果目标类型为bool,则这是一个布尔转换(见下文)。

-400不能放入unsigned中,因此该行为未定义。试图推理任何类型的一致性都是没有用的。

由于这是未定义的行为,编译器在这种情况下可以做任何它想做的事情。通常情况下,他们会做任何可以使其馀的(定义的)行为更容易编码的事情。尽管流行的说法,编译器不太可能使魔鬼飞出你的鼻子,但一个不应该期待任何行为特别。