等于equal是false的C ++规则是什么?鉴于:
float f {-1.0};
bool equal = (static_cast<unsigned>(f) == static_cast<unsigned>(-1.0));
例如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;
}
产生以下输出:
f=ffffffff
cf=0
6
祝您投票愉快:有关不确定行为,您经常被遗忘的规则所困扰!
—
Bathsheba
您期望将负浮点数转换为无符号数有什么结果?
—
Amadeus
@Amadeus可能是我们在转换负整数时得到的通常环绕。我不得不检查那是UB,因为这让我感到惊讶。
—
AProgrammer19年
@Amadeus,更多的是了解差异。我在几周前修复了一个错字错误... const-float被显式强制转换为unsigned(错误),然后隐式地恢复为signed(作为一个签名函数参数)。后来我思考为什么原始的bug导致该函数的值为零。测试表明这是因为浮点数是常量。显式强制转换为无符号然后隐式转换为有符号的非常量浮点数不会产生相同的行为-两次强制转换的非常量具有原始值和期望值。
—
GreyMattR