为什么在C ++中,如果数字为常数,则负数的static_cast <unsigned>会不同吗?

Gre*_*ttR 26 c++ casting

等于equalfalse的C ++规则是什么?鉴于:

float f {-1.0};
bool equal = (static_cast<unsigned>(f) == static_cast<unsigned>(-1.0));
Run Code Online (Sandbox Code Playgroud)

例如https://godbolt.org/z/fcmx2P

#include <iostream>

int main() 
{
          float   f {-1.0};
    const float  cf {-1.0};

    std::cout << std::hex;
    std::cout << " f" << "=" << static_cast<unsigned>(f) << '\n';
    std::cout << "cf" << "=" << static_cast<unsigned>(cf) << '\n';

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

 f=ffffffff
cf=0
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 23

程序的行为是不确定的:C ++标准未定义浮点类型unsigned类型的转换。

(请注意,熟悉的环绕行为仅适用于负整数类型。)

因此,尝试解释程序输出毫无意义。

  • @Yksisarvinen:仅当“ float”在“ int”的范围内时。 (5认同)
  • @GreyMattR如果编译器可以证明在强制转换时该值肯定为负,则它可以保留强制转换的结果未初始化,将其设置为零或执行其他任何操作。如果编译器无法证明这一点,则它必须生成代码以执行强制转换。为此,它可以重用代码以将其转换为有符号整数类型(如果转换为UB,则结果只会是“错误的”,这意味着它实际上并不是错误的)。通过更积极的优化,在非const情况下也不会发出强制类型转换。 (5认同)