กฎ C ++ ที่มีความหมายเท่าเทียมกันคือเท็จ ? ได้รับ:
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
มี upvote: คุณถูกจับโดยกฎที่มักถูกลืมเกี่ยวกับพฤติกรรมที่ไม่ได้กำหนด!
—
Bathsheba
ผลลัพธ์ใดที่คุณคาดหวังว่าจะแปลงทุ่นเชิงลบเป็นสัญญาณที่ไม่ได้ลงชื่อ
—
อะมาดิอุส
@Ajustus อาจเป็นเรื่องปกติที่เราได้รับเมื่อแปลงจำนวนเต็มลบ ฉันต้องตรวจสอบว่ามันเป็น UB เพราะนั่นทำให้ฉันประหลาดใจ
—
AProgrammer
@Amadeus มันเป็นกรณีที่เข้าใจความแตกต่าง ฉันแก้ไขข้อผิดพลาดการพิมพ์ไม่กี่สัปดาห์ที่ผ่านมา ... const-float ถูกบล็อกอย่างชัดเจนเพื่อไม่ได้ลงนาม (ข้อผิดพลาด) และโดยปริยายกลับสู่การเซ็นชื่อ (เป็นพารามิเตอร์ฟังก์ชันที่ลงนามแล้ว) ในภายหลังฉันได้ไตร่ตรองว่าเหตุใดข้อผิดพลาดดั้งเดิมทำให้เกิดค่าศูนย์ในฟังก์ชัน การทดสอบแสดงให้เห็นว่าเป็นเพราะการลอยตัวเป็นค่าคงที่ การลอยตัวแบบไม่ใช่ const ที่โยนลงมาอย่างไม่ระบุชื่อและจากนั้นการโยนกลับไปที่การเซ็นชื่อนั้นไม่ได้ส่งผลให้เกิดผลเหมือนกัน - ไม่ใช่แบบสองครั้งที่มีค่าคงที่เดิมและคาดหวัง
—
GreyMattR