Tôi thực sự không thể tìm thấy một nguồn "có thẩm quyền" về vấn đề này, chủ yếu là vì đây có lẽ là vấn đề quy ước và thuật ngữ thường không nhất quán. Nhưng, đoạn trích sau đây từ " Mã hóa an toàn trong C và C ++ " của Robert Seacord đã tóm tắt sự hiểu biết của tôi về tình huống này:
Một tràn số nguyên xảy ra khi một số nguyên được tăng vượt quá giá trị tối đa của nó hoặc giảm vượt quá giá trị tối thiểu 3 của nó . Tràn số nguyên có liên quan chặt chẽ với biểu diễn bên dưới.
Các chú thích tiếp tục nói:
[3] Giảm một số nguyên vượt quá giá trị tối thiểu của nó thường được gọi là một số nguyên underflow , mặc dù về mặt kỹ thuật ngữ này dùng để chỉ một tình trạng dấu chấm động.
Lý do chúng tôi gọi nó là tràn số nguyên là vì không có đủ không gian có sẵn trong loại để thể hiện giá trị. Theo nghĩa đó, nó tương tự như tràn bộ đệm (ngoại trừ thay vì thực sự vượt qua ranh giới bộ đệm, nó thường thể hiện hành vi bao quanh. *) Từ quan điểm này, không có sự khác biệt về khái niệm giữa INT_MIN - 1
và INT_MAX + 1
. Trong cả hai trường hợp, đơn giản là không có đủ không gian trong int
loại dữ liệu để biểu thị một trong hai giá trị - vì vậy những gì chúng ta có là một tràn .
Cũng có thể hữu ích khi lưu ý rằng trong kiến trúc bộ xử lý x86 và x86_64, thanh ghi cờ bao gồm một bit tràn . Bit tràn được thiết lập khi hoạt động số học số nguyên đã ký tràn. Biểu thức INT_MIN - 1
sẽ đặt bit tràn. (Không có bit "underflow".) Vì vậy, rõ ràng, các kỹ sư của AMD và Intel sử dụng thuật ngữ "tràn" để mô tả kết quả của một phép toán số nguyên có quá nhiều bit phù hợp với kiểu dữ liệu, bất kể là giá trị số quá lớn hoặc quá nhỏ.
* Trong thực tế, trong C, tràn số nguyên đã ký thực sự là hành vi không xác định, nhưng trong các ngôn ngữ khác như Java, số học bổ sung của hai sẽ bao quanh.
INT_MIN - 1
hayINT_MAX + 1