Jawaban untuk ini "secara mengejutkan" sederhana:
Pertama - karena sebagian besar dari Anda mungkin tahu - bilangan bulat 32-bit berkisar dari 2.147.483.648 hingga 2.147.483.647 . Jadi, apa yang terjadi jika PHP mendapatkan hasil, yang LEBIH BESAR dari ini?
Biasanya, orang akan mengharapkan "Overflow" langsung, menyebabkan 2.147.483.647 +1 berubah menjadi −2.147.483.648 . Namun, itu BUKAN terjadi. JIKA PHP menemukan jumlah yang lebih besar, itu Mengembalikan FLOAT daripada INT.
Jika PHP menemukan angka di luar batas tipe integer, itu akan ditafsirkan sebagai float. Juga, operasi yang menghasilkan angka di luar batas tipe integer akan mengembalikan float sebagai gantinya.
http://php.net/manual/en/language.types.integer.php
Ini mengatakan, dan mengetahui bahwa implementasi PHP FLOAT mengikuti Format presisi ganda IEEE 754, berarti, PHP mampu menangani angka hingga 52 bit, tanpa kehilangan presisi. (Pada Sistem 32-bit)
Jadi, di Point, di mana jumlah Anda mencapai 9.007.199.254.740.992 (yang merupakan 2 ^ 53 ) Nilai Float yang dikembalikan oleh PHP Maths tidak lagi cukup akurat.
E:\PHP>php -r "$x=bindec(\"100000000000000000000000000000000000000000000000000000\"); echo number_format($x,0);"
9.007.199.254.740.992
E:\PHP>php -r "$x=bindec(\"100000000000000000000000000000000000000000000000000001\"); echo number_format($x,0);"
9.007.199.254.740.992
E:\PHP>php -r "$x=bindec(\"100000000000000000000000000000000000000000000000000010\"); echo number_format($x,0);"
9.007.199.254.740.994
Contoh ini Shows the Point, di mana PHP kehilangan presisi. Pertama, bit signifikansi terakhir akan dihapus, menyebabkan 2 ekspresi pertama menghasilkan angka yang sama - yang tidak.
Mulai SEKARANG, seluruh matematika akan salah, saat bekerja dengan tipe data default.
• Apakah itu masalah yang sama untuk bahasa yang ditafsirkan lain seperti Python atau Perl?
Saya kira tidak. Saya pikir ini adalah masalah bahasa yang tidak memiliki keamanan jenis. Sementara Integer Overflow seperti yang disebutkan di atas AKAN terjadi di setiap bahasa yang menggunakan tipe data tetap, bahasa tanpa keamanan tipe mungkin mencoba untuk menangkap ini dengan tipe data lain. Namun, begitu mereka mencapai Perbatasan "alami" (yang diberikan Sistem) - mereka mungkin mengembalikan apa pun, tetapi hasilnya benar.
Namun, setiap bahasa dapat memiliki utas berbeda untuk Skenario semacam itu.