¿Cuáles son las reglas de C ++ que significan que igual es falso ? Dado:
float f {-1.0};
bool equal = (static_cast<unsigned>(f) == static_cast<unsigned>(-1.0));
Por ejemplo, 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;
}
Produce el siguiente resultado:
f=ffffffff
cf=0
66
Obtenga un voto positivo: ¡ha sido atrapado por una regla olvidada a menudo sobre el comportamiento indefinido!
—
Betsabé el
¿Qué resultados esperas convertir un flotador negativo en un sin signo?
—
Amadeus
@Amadeus probablemente sea el ajuste habitual que obtenemos al convertir un entero negativo. Tuve que comprobar que era UB porque eso me sorprendió.
—
Programador
@Amadeus, fue más un caso de entender la diferencia. Arreglé un error tipográfico hace unas semanas ... un const-float fue lanzado explícitamente a unsigned (el error), e implícitamente regresó a firmado (como un parámetro de función firmado). Más tarde reflexioné sobre por qué el error original estaba causando un valor cero en la función. Las pruebas sugieren que fue porque el flotador era constante. Un flotador sin constante que fue lanzado explícitamente a sin firmar y luego implícitamente devuelto a firmado no resultó en el mismo comportamiento: el no const de dos lanzamientos tenía el valor original y esperado.
—
GreyMattR