Trên/underflow được về mặt toán học cũng xác định cho kích thước cố định nguyên số học:
(1 - 0xFFFFFFFF) % (1<<32) =
(1 + -0xFFFFFFFF) % (1<<32) =
1 + (-0xFFFFFFFF % (1<<32)) = 2
này là kết quả chính xác!
Cụ thể, kết quả sau khi quá/tràn là bí danh của số nguyên chính xác. Trong thực tế, mọi số nguyên không thể đại diện được đặt bí danh (không phân biệt được) với một số nguyên thể hiện được - được tính là vô cùng trong số nguyên có kích thước cố định và bạn sẽ lặp lại chính mình, tròn và tròn như mặt đồng hồ tương tự.
Số nguyên N bit đại diện cho bất kỳ số nguyên thực nào modulo 2^N. Trong C, modulo 2^N được viết dưới dạng% (1 < < 32).
Tôi tin rằng C guarrantees tính chính xác toán học của over/underflow, nhưng chỉ cho số nguyên unsigned. Ký dưới/tràn được giả định là không bao giờ xảy ra (vì lợi ích tối ưu hóa). Trong thực tế, các số nguyên đã ký là bổ sung của hai, mà không có sự khác biệt về cộng hoặc trừ, do đó, hành vi dưới/tràn chính xác là guarranteed cho các số nguyên đã ký (mặc dù không phải bằng C).
+1 Đánh bại tôi bằng một vài giây. Đẹp đào! – templatetypedef
+1 Wow, tôi (rõ ràng) không bao giờ biết điều này không xác định-ness là một phần của tiêu chuẩn. Nhưng, trong trường hợp này, không phải là 'ptrdiff_t' chỉ là một 'ký hiệu size_t' được tôn vinh? – Mehrdad
@templatetypedef: Tôi vui mừng, một lần, không thức dậy sau khi trận chiến đã được chiến đấu :) @Mehrdad: Tôi sẽ nói nó là :) Mặt khác, không có gì cấm việc thực hiện thư viện chuẩn mà bạn sử dụng để sử dụng 64 -bất số nguyên ngay cả trên nền tảng 32 bit. Tiêu chuẩn chỉ nói rằng không bắt buộc họ phải nỗ lực. Phần còn lại là vấn đề Chất lượng thực hiện. –