pengantar
Masalahnya adalah integer overflow. Jika meluap, nilai kembali ke nilai minimum dan berlanjut dari sana. Jika tidak mengalir, nilai kembali ke nilai maksimum dan berlanjut dari sana. Gambar di bawah ini adalah Odometer. Saya menggunakan ini untuk menjelaskan overflow. Ini adalah luapan mekanis tetapi masih merupakan contoh yang bagus.
Dalam sebuah Odometer, max digit = 9
itu melampaui sarana maksimum 9 + 1
, yang membawa dan memberikan 0
; Namun tidak ada digit yang lebih tinggi untuk diubah menjadi a 1
, sehingga penghitung diatur ulang ke zero
. Anda mendapatkan ide - "integer overflows" muncul di benak Anda sekarang.
Literal desimal terbesar dari tipe int adalah 2147483647 (2 31 -1). Semua literal desimal dari 0 hingga 2147483647 dapat muncul di mana pun literal int dapat muncul, tetapi literal 2147483648 hanya dapat muncul sebagai operan operator negasi unary -.
Jika penjumlahan bilangan bulat meluap, maka hasilnya adalah bit orde rendah dari jumlah matematis seperti yang direpresentasikan dalam beberapa format komplemen dua yang cukup besar. Jika terjadi overflow, maka tanda hasil tidak sama dengan tanda penjumlahan matematis dari kedua nilai operan.
Dengan demikian, 2147483647 + 1
melimpah dan membungkus -2147483648
. Karenanya int i=2147483647 + 1
akan meluap, yang tidak sama dengan 2147483648
. Selain itu, Anda mengatakan "selalu mencetak 0". Tidak, karena http://ideone.com/WHrQIW . Di bawah, 8 angka ini menunjukkan titik di mana ia berputar dan meluap. Kemudian mulai mencetak 0s. Juga, jangan heran betapa cepatnya menghitung, mesin-mesin saat ini sangat cepat.
268435456
536870912
1073741824
-2147483648
0
0
0
0
Mengapa integer overflow "membungkus"
PDF asli