Temui mengapa 8%-3 sama dengan 0 dalam PHP
Kebanyakan orang menghadapi beberapa situasi pelik semasa melakukan operasi matematik dalam bahasa PHP. Salah satunya adalah dengan mengira 8% (modul 3) yang menghasilkan 0. Keputusan ini kelihatan agak pelik, kerana secara teorinya 8 tidak boleh dibahagikan dengan 3, jadi harus ada baki.
Sebelum kita menyelidiki lebih mendalam, mari kita lihat dahulu operator modulo “%” dalam PHP. Operasi modulo digunakan untuk mengira baki antara dua nombor. Operasi khusus adalah untuk membahagikan nombor pertama dengan nombor kedua, dan kemudian mengambil baki sebagai hasilnya.
Dalam PHP, prinsip penting peraturan operasi modulo ialah: tanda hasil modulo adalah konsisten dengan tanda modulus. Jadi jika modulus positif, maka hasil modulo juga akan positif. Begitu juga, jika modulus negatif, hasil modulo juga negatif.
Berbalik kepada contoh kami, 8%-3 sepatutnya mengembalikan baki negatif, bukan 0. Tetapi mengapa PHP mengembalikan 0?
Jawapan kepada soalan ini sebenarnya melibatkan beberapa konsep matematik dan pengaturcaraan daripada sains komputer.
Pertama, kita perlu memahami cara integer diwakili dalam PHP. Dalam PHP, integer boleh dibahagikan kepada dua jenis: integer bertanda (integer bertanda) dan integer tidak bertanda (integer tidak bertanda). Integer bertanda ialah integer yang boleh diwakili oleh tanda positif dan negatif, manakala integer tidak bertanda hanya boleh mewakili integer bukan negatif.
Secara lalai, integer dalam PHP ialah integer yang ditandatangani. Ini bermakna 8 dan -3 kedua-duanya adalah integer yang ditandatangani. Apabila kita mengira 8%-3, PHP akan menukar dua nombor kepada jenis yang sama dan kemudian melakukan pengiraan.
Dalam kes ini, 8 ditukar kepada integer yang ditandatangani dan perwakilan perduaannya ialah 0000000000000000000000000001000. Dan -3 juga ditukar kepada integer bertanda, dan perwakilan binarinya ialah 111111111111111111111111111101.
Seterusnya, PHP melakukan operasi modulo pada dua nombor ini. Malah, PHP akan menggunakan formula berikut untuk mengira modulo integer:
a % b = a - b * floor(a / b)
Mengikut formula ini, mari kita hitung hasil 8%-3:
8 - (-3) lantai(8 / -3) = 8 - (-3) -2 = 8 - 6 = 2
Mengikut pengiraan ini, hasil yang kita dapat ialah 2, bukan operasi modulus integer. keputusan lalai ialah 0. kenapa ni?
Sebabnya ialah operator modulo integer "%" dalam PHP tidak mematuhi sepenuhnya definisi matematik. Menurut definisi matematik tradisional, hasil operasi modulo hendaklah antara 0 dan modulus. Dalam PHP, apabila modulus ialah nombor negatif, hasil operasi modulo ialah baki negatif tolak nilai mutlak modulus.
Jadi dalam contoh kita, apabila 8 digunakan sebagai modulus, 2 ialah hasil modulo undang-undang. Tetapi kerana kita memberi tumpuan kepada keadaan apabila modulus negatif, keputusan akhir ialah 0.
Ringkasnya, sebab mengapa 8%-3 dalam PHP adalah sama dengan 0 ialah reka bentuk PHP pengendali modulo "%" tidak mematuhi sepenuhnya definisi matematik tradisional, tetapi melaraskan hasil mengikut tanda modulus.
Walaupun keputusan ini kelihatan agak pelik, dalam pengaturcaraan sebenar, kami boleh mengendalikan dan memproses operasi matematik mengikut peraturan ini untuk mengelakkan keputusan yang tidak dijangka.
Ringkasan
Artikel ini meneroka sebab 8%-3 sama dengan 0 dalam PHP. Dengan menganalisis perwakilan integer yang ditandatangani dan tidak ditandatangani dalam PHP, serta definisi operasi modulo integer, kami mengetahui bahawa pengendali modulo PHP "%" tidak mematuhi sepenuhnya definisi matematik tradisional. Perlu diingat bahawa dalam pengaturcaraan sebenar, kita harus memahami peraturan ini dan mengendalikan operasi matematik dengan sewajarnya untuk mendapatkan hasil yang diharapkan.
Atas ialah kandungan terperinci Analisis sebab mengapa 8%-3 adalah sifar dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!