Sepertinya saya ingat bahwa saya sedang membaca itu
underflow
berarti Anda memiliki besaran terlalu kecil yang tidak dapat disajikan lagi dalam suatu jenisoverflow
berarti Anda memiliki magnitudo yang terlalu besar sehingga tidak dapat ditampilkan dalam suatu tipe
Namun, dalam praktiknya saya memahami bahwa istilah tersebut digunakan sedemikian rupa
underflow
berarti Anda memiliki terlalu kecil nilai yang tidak dapat disajikan lagi di tipeoverflow
berarti Anda memiliki terlalu besar nilai yang tidak dapat disajikan lagi di tipe
Apa arti yang benar untuk digunakan di sini? Apakah istilah didefinisikan secara berbeda untuk tipe integer dan floating point?
terminology
Johannes Schaub - litb
sumber
sumber
INT_MIN - 1
atauINT_MAX + 1
Jawaban:
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:
Catatan kaki selanjutnya mengatakan:
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
danINT_MAX + 1
. Dalam kedua kasus tidak ada cukup ruang dalamint
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.
sumber
Itu meluap. Underflow tidak terjadi untuk nilai integer.
Overflow adalah ketika nilai terlalu besar (terlalu jauh dari nol) untuk diwakili oleh tipe tertentu, dan underflwo adalah ketika terlalu kecil (terlalu dekat dengan nol).
Karena nilai integer yang paling dekat dengan nol (1 dan -1) masih dapat diwakili oleh variabel integer mana saja (dengan asumsi integer yang ditandatangani dengan lebih dari satu bit), aliran bawah tidak dapat terjadi.
The artikel Wikipedia pada underflow memiliki gambaran cukup jelas:
sumber
underflow
sering digunakan secara khusus untuk merujuk pada kondisi tertentu di mana besaran bilangan lebih kecil dari nilai terkecil yang tidak nol, tetapi lebih besar dari jarak terkecil yang mungkin antara nilai bukan nol - di lain kata-kata, kasus-kasus di mana angka-angka masuk ke dalam apa yang oleh artikel Wiki disebut sebagai "celah bawah air". Pada implementasi IEEE-744-compliant, angka keterwakilan terkecil sama dengan perbedaan terwakili terkecil antara angka, sehingga arus bawah seperti itu tidak dapat terjadi, tetapi di luar dunia PC, tidak semua sistem kompatibel dengan IEEE.Dalam matematika integer, overflow mengacu pada nilai yang terlalu besar dan terlalu kecil. Dalam floating point, overflow mengacu pada eksponen yang terlalu besar, dan underflow merujuk pada eksponen yang terlalu kecil.
Bahkan, untuk tipe integer , CPU tidak memiliki cara untuk membedakan antara overflow dan underflow. Ambil tambahan 16-bit berikut:
Bendera melimpah di CPU, tentu saja, akan ditetapkan setelah add ini. Menggunakan matematika yang ditandatangani, hasilnya terlalu kecil (-32768). Menggunakan matematika yang tidak ditandatangani, hasilnya terlalu besar (0x17FFF). Karena matematika komplemen 2 adalah identik untuk tipe bertanda tangan dan tidak bertanda,
overflow
dipaksa untuk berarti nilai yang terlalu besar dan terlalu kecil.sumber