(Tôi đã gắn thẻ câu hỏi "C" trong thời gian này, nhưng nếu bạn biết về một ngôn ngữ khác hỗ trợ các công đoàn, bạn cũng có thể sử dụng câu hỏi đó.)
Nhiệm vụ của bạn là xây dựng bốn toán tử chuẩn + - * /
cho cấu trúc sau:
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;}
}
sao cho các thao tác chỉ tự thao tác hoặc truy cập vào phần nguyên (do đó không so sánh với nhân đôi bất kỳ lúc nào trong quá trình hoạt động) và kết quả hoàn toàn giống nhau (hoặc tương đương về mặt chức năng, trong trường hợp kết quả không phải là số như NaN
) như thể hoạt động toán học tương ứng đã được áp dụng thẳng vào double
thay thế.
Bạn có thể chọn phần nguyên nào để thao tác, thậm chí có thể sử dụng các phần khác nhau giữa các toán tử khác nhau. (Bạn cũng có thể chọn xóa "không dấu" khỏi bất kỳ trường nào trong liên minh, mặc dù tôi không chắc liệu bạn có muốn làm điều đó không.)
Điểm của bạn là tổng độ dài của mã theo các ký tự cho mỗi trong số bốn toán tử. Điểm số thấp nhất chiến thắng.
Đối với những người trong chúng ta không quen thuộc với thông số kỹ thuật của IEEE 754, đây là một bài viết về nó trên Wikipedia.
Chỉnh sửa:
03-06 08:47 Đã thêm các hàm tạo vào cấu trúc intfloat. Bạn được phép sử dụng chúng để thử nghiệm, thay vì cài đặt thủ công / v.v.
intstruct
theo nghĩa uint8_8
, uint16_t
và như vậy là kích thước tuyệt đối short
, int
v.v. không được xác định theo tiêu chuẩn (mỗi loại có kích thước tối thiểu và có một thứ tự nghiêm ngặt về kích thước, nhưng đó là nó).