Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Hệ điều hành Unix] Sự cố Y2038 (tràn 32-bit)

    Vấn đề năm 2038

    Trên hệ thống lưu time_t kiểu signed 32-bit, timestamp lớn nhất là 2147483647 ứng với 03:14:07 UTC ngày 19/01/2038. Vượt mốc này, giá trị tràn (overflow) và quấn vòng (wrap-around) về số âm — máy hiểu nhầm là năm 1901.

    Cho timestamp ts (kiểu 64-bit, không tràn ở tầng đọc):

    • Nếu ts ≤ 2147483647: in OK <YYYY-MM-DD HH:MM:SS>.
    • Nếu ts > 2147483647: mô phỏng tràn 32-bit có dấu, lấy giá trị sau khi quấn vòng trong khoảng [-2^31, 2^31-1], rồi in OVERFLOW <YYYY-MM-DD HH:MM:SS> của giá trị đã quấn (UTC).

    Công thức wrap có dấu

    wrapped = ((ts + 2^31) mod 2^32) - 2^31.

    Ví dụ

    • 2147483647 → OK 2038-01-19 03:14:07.
    • 2147483648 → quấn thành -2147483648 → OVERFLOW 1901-12-13 20:45:52.
    • Định dạng đầu vào:

      Một dòng chứa timestamp ts (số nguyên không âm 64-bit).

    • Ràng buộc đầu vào:

      0 ≤ ts ≤ 4294967295.

    • Định dạng đầu ra:

      OK <ngày giờ> hoặc OVERFLOW <ngày giờ> theo UTC.

    Ví dụ:

    Đầu vào:

    2147483647
    

    Đầu ra:

    OK 2038-01-19 03:14:07

    Giải thích:

    Đúng mốc lớn nhất của signed 32-bit, chưa tràn nên in OK.

    Đang tải editor...