Какие правила С ++ означают, что равно равно ложно ? Данный:
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
Имейте в виду: вы были пойманы часто забытым правилом о неопределенном поведении!
—
Вирсавия
Каких результатов вы ожидаете, преобразовав отрицательное число с плавающей точкой в беззнаковое?
—
Амадеус
@ Amadeus, вероятно, обычная обертка, которую мы получаем при преобразовании отрицательного целого числа. Я должен был проверить, что это был UB, потому что это удивило меня.
—
AProgrammer
@ Амадеус, это был скорее случай понимания разницы. Я исправил ошибку опечатки несколько недель назад ... const-float был явно приведен к unsigned (ошибка) и неявно обратно к подписанному (как параметр функции sign). Позже я подумал, почему исходная ошибка приводила к нулевому значению в функции. Тестирование показывает, что это произошло потому, что поплавок был постоянным. Неконстантный float, который был явно приведен к unsigned, а затем неявно приведен к подписанному, не привел к тому же поведению - двойное приведение non-const имело исходное и ожидаемое значение.
—
GreyMattR