(ฉันติดแท็กคำถาม "C" ในขณะนั้น แต่ถ้าคุณรู้ภาษาอื่นที่สนับสนุนสหภาพคุณสามารถใช้มันได้)
งานของคุณคือการสร้างตัวดำเนินการทางคณิตศาสตร์สี่มาตรฐาน+ - * /
สำหรับโครงสร้างต่อไปนี้:
union intfloat{
double f;
uint8_t h[8];
uint16_t i[4];
uint32_t j[2];
uint64_t k;
intfloat(double g){f = g;}
intfloat(){k = 0;}
}
เช่นว่าการดำเนินการของตัวเองเท่านั้นที่จะจัดการหรือเข้าถึงส่วนจำนวนเต็ม (ดังนั้นจึงไม่มีการเปรียบเทียบกับสองครั้งตลอดเวลาในระหว่างการดำเนินการอย่างใดอย่างหนึ่ง) และผลที่ได้คือเหมือนกัน (หรือเทียบเท่าตามหน้าที่ในกรณีของผลลัพธ์ที่ไม่ใช่ตัวเลขเช่นNaN
) ราวกับว่าการดำเนินการทางคณิตศาสตร์ที่สอดคล้องกันถูกนำไปใช้โดยตรงกับdouble
แทน
คุณอาจเลือกส่วนจำนวนเต็มเพื่อจัดการแม้กระทั่งการใช้ส่วนต่าง ๆ ในตัวดำเนินการที่แตกต่างกัน (คุณสามารถเลือกที่จะลบ "unsigned" ออกจากฟิลด์ใด ๆ ในสหภาพได้แม้ว่าฉันไม่แน่ใจว่าต้องการทำเช่นนั้นหรือไม่)
คะแนนของคุณคือผลรวมของความยาวของรหัสเป็นอักขระสำหรับผู้ให้บริการแต่ละราย คะแนนต่ำสุดชนะ
สำหรับพวกเราที่ไม่คุ้นเคยกับข้อกำหนด IEEE 754 นี่เป็นบทความเกี่ยวกับเรื่องนี้ใน Wikipedia
การแก้ไข:
03-06 08:47เพิ่มคอนสตรัคเตอร์ให้กับโครงสร้าง intfloat คุณได้รับอนุญาตให้ใช้พวกเขาสำหรับการทดสอบแทนที่จะตั้งค่า double / etc ด้วยตนเอง
intstruct
ในแง่ของuint8_8
, uint16_t
และอื่น ๆ เป็นขนาดที่แน่นอนของshort
, int
และอื่น ๆ ยังไม่ได้กำหนดโดยมาตรฐาน (แต่ละประเภทมีขนาดต่ำสุดและมีการสั่งซื้ออย่างเข้มงวดขนาด แต่ แค่นั้นแหละ).