Apakah INT_MIN-1 adalah underflow atau overflow?

10

Sepertinya saya ingat bahwa saya sedang membaca itu

  • underflowberarti Anda memiliki besaran terlalu kecil yang tidak dapat disajikan lagi dalam suatu jenis
  • overflowberarti Anda memiliki magnitudo yang terlalu besar sehingga tidak dapat ditampilkan dalam suatu tipe

Namun, dalam praktiknya saya memahami bahwa istilah tersebut digunakan sedemikian rupa

  • underflowberarti Anda memiliki terlalu kecil nilai yang tidak dapat disajikan lagi di tipe
  • overflowberarti 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?

Johannes Schaub - litb
sumber
2
Secara umum, istilah "underflow" tampaknya dicadangkan untuk aritmatika floating point. Dengan bilangan bulat, saya biasanya mengatakan "meluap" terlepas dari apakah itu INT_MIN - 1atauINT_MAX + 1
Charles Salvia

Jawaban:

15

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 - 1dan INT_MAX + 1. Dalam kedua kasus tidak ada cukup ruang dalam inttipe 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 - 1akan 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.

Charles Salvia
sumber
6

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:

"Istilah arithmetic underflow (atau" floating point underflow ", atau hanya" underflow ") adalah suatu kondisi dalam program komputer yang dapat terjadi ketika hasil sebenarnya dari operasi floating point lebih kecil dalam besarnya (yaitu, mendekati nol) dari nilai terkecil yang dinyatakan sebagai angka floating point normal dalam tipe data target. Underflow sebagian dapat dianggap sebagai luapan negatif dari eksponen nilai floating point. "

Guffa
sumber
Mungkin berguna untuk mencatat bahwa underflowsering 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.
supercat
2

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:

  0x8000 (unsigned 32768, or signed -32767)
+ 0xFFFF (unsigned 65535, or signed -1)
--------
  0x7FFF (32767, the carried '1' is lost)

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, overflowdipaksa untuk berarti nilai yang terlalu besar dan terlalu kecil.

Catatan untuk memikirkan nama
sumber