Apa C ++ aturan yang berarti sama adalah palsu ?. Diberikan:
float f {-1.0};
bool equal = (static_cast<unsigned>(f) == static_cast<unsigned>(-1.0));
Misalnya 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;
}
Menghasilkan output berikut:
f=ffffffff
cf=0
6
Punya suara positif: Anda telah tertangkap oleh aturan yang sering dilupakan tentang perilaku yang tidak terdefinisi!
—
Batsyeba
Hasil apa yang Anda harapkan untuk mengubah float negatif menjadi yang tidak ditandatangani?
—
Amadeus
@Amadeus mungkin membungkus yang biasa kita dapatkan ketika mengkonversi bilangan bulat negatif. Saya harus memeriksa bahwa itu adalah UB karena itu mengejutkan saya.
—
Pemrogram
@Amadeus, itu lebih merupakan kasus memahami perbedaan. Saya memperbaiki kesalahan ketik beberapa minggu yang lalu ... sebuah konstanta float secara eksplisit dilemparkan ke unsigned (bug), dan secara implisit kembali ke yang ditandatangani (sebagai parameter fungsi yang ditandatangani). Saya kemudian merenungkan mengapa bug asli menyebabkan nilai nol dalam fungsi. Pengujian menunjukkan itu karena float adalah const. Pelampung non-const yang secara eksplisit dilemparkan ke unsigned dan kemudian secara implisit dilemparkan kembali untuk ditandatangani tidak menghasilkan bahaviour yang sama - non-cast non-const memiliki nilai asli dan yang diharapkan.
—
GreyMattR