Có gì quy tắc C ++ đó có nghĩa tương đương là sai ?. Được:
float f {-1.0};
bool equal = (static_cast<unsigned>(f) == static_cast<unsigned>(-1.0));
Ví dụ: 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;
}
Tạo đầu ra sau:
f=ffffffff
cf=0
6
Có một upvote: bạn đã bị bắt bởi một quy tắc quên lãng về hành vi không xác định!
—
Bathsheba
Những kết quả nào bạn mong đợi khi chuyển đổi một dấu phẩy âm thành dấu không dấu?
—
Amadeus
@AADEus có lẽ là gói thông thường xung quanh chúng ta nhận được khi chuyển đổi số nguyên âm. Tôi phải kiểm tra xem đó có phải là UB không vì điều đó làm tôi ngạc nhiên.
—
AProgrammer
@AADEus, đó là một trường hợp hiểu sự khác biệt. Tôi đã sửa một lỗi đánh máy vài tuần trước ... một const-float rõ ràng được chuyển thành không dấu (lỗi) và hoàn toàn quay lại ký (như một tham số chức năng đã ký). Sau đó tôi đã suy nghĩ tại sao lỗi ban đầu lại gây ra giá trị 0 trong hàm. Kiểm tra cho thấy đó là bởi vì float là const. Một dấu phẩy không phải được xác định rõ ràng thành không dấu và sau đó hoàn toàn chuyển trở lại thành đã ký không dẫn đến cùng một bahaviour - không phải là hai lần có giá trị ban đầu và dự kiến.
—
GreyMattR