Saya benar-benar tidak dapat menemukan sumber "otoritatif" tentang masalah ini, terutama karena ini mungkin masalah konvensi, dan terminologi sering sangat tidak konsisten. Tapi, kutipan dari Robert Seacord " Secure Coding in C and C ++ " merangkum pemahaman saya tentang situasi ini:
Overflow bilangan bulat terjadi ketika bilangan bulat meningkat melampaui nilai maksimumnya atau menurun melampaui nilai minimumnya 3 . Overflow bilangan bulat terkait erat dengan representasi yang mendasarinya.
Catatan kaki selanjutnya mengatakan:
[3] Penurunan integer di luar nilai minimumnya sering disebut sebagai integer underflow , meskipun secara teknis istilah ini merujuk pada kondisi titik mengambang.
Alasan kami menyebutnya integer overflow adalah karena tidak ada cukup ruang yang tersedia di tipe untuk mewakili nilai. Dalam hal ini, ini mirip dengan buffer overflow (kecuali daripada benar-benar melewati batas buffer, biasanya menunjukkan perilaku wrap-around. *) Dari perspektif ini, tidak ada perbedaan konseptual antara INT_MIN - 1
dan INT_MAX + 1
. Dalam kedua kasus tidak ada cukup ruang dalam int
tipe data untuk mewakili nilai baik - jadi apa yang kita miliki adalah kelebihan .
Mungkin juga berguna untuk dicatat bahwa dalam arsitektur prosesor x86 dan x86_64, register flags menyertakan bit overflow . Bit overflow diatur ketika operasi aritmatika integer yang ditandatangani meluap. Ekspresi INT_MIN - 1
akan mengatur bit overflow. (Tidak ada bit "underflow".) Jadi jelas, para insinyur di AMD dan Intel menggunakan istilah "overflow" untuk menggambarkan hasil operasi aritmatika integer yang memiliki terlalu banyak bit untuk ditampung dalam tipe data, terlepas dari apakah nilainya terlalu besar atau terlalu kecil.
* Faktanya, di C, integer yang ditandatangani ditandatangani sebenarnya adalah perilaku yang tidak terdefinisi, tetapi dalam bahasa lain seperti Java, aritmatika komplemen dua akan membungkus.
INT_MIN - 1
atauINT_MAX + 1