Quais são as regras do C ++ que significam igual é falso ? Dado:
float f {-1.0};
bool equal = (static_cast<unsigned>(f) == static_cast<unsigned>(-1.0));
Por exemplo, 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;
}
Produz a seguinte saída:
f=ffffffff
cf=0
6
Tenha um voto positivo: você foi pego por uma regra muitas vezes esquecida sobre comportamento indefinido!
—
Bathsheba
Quais resultados você espera converter um float negativo em um não assinado?
—
Amadeus
@Amadeus provavelmente é o que de costume temos ao converter um número inteiro negativo. Eu tive que verificar se era UB porque isso me surpreendeu.
—
AProgrammer 18/11/19
@Amadeus, foi mais um caso de entender a diferença. Corrigi um erro de digitação há algumas semanas atrás ... um const-float foi explicitamente convertido em sem sinal (o bug) e implicitamente de volta ao assinado (como um parâmetro de função assinado). Mais tarde, ponderei por que o bug original estava causando um valor zero na função. Os testes sugerem que foi porque o flutuador era const. Um float não const que foi explicitamente convertido para não assinado e, em seguida, convertido implicitamente de volta para assinado não resultou no mesmo comportamento - o non-const convertido duas vezes tinha o valor original e esperado.
—
GreyMattR