Operator Modulus Mengendalikan Nombor Negatif dalam C/C /Obj-C
Tidak seperti dalam matematik, operator modulus (%) dalam C- bahasa terbitan mempamerkan tingkah laku yang tidak konsisten apabila digunakan pada nombor negatif. Percanggahan ini timbul daripada kekaburan yang mengelilingi tanda baki.
Tingkahlaku Ditentukan Pelaksanaan
Mengikut piawaian C 03, tanda baki apabila kedua-dua operan negatif adalah ditakrifkan pelaksanaan. Ini bermakna penyusun dan platform yang berbeza mungkin menghasilkan hasil yang berbeza untuk operasi seperti (-1) % 8 dan fmodf(-1, 8).
Ungkapan Boleh Dipercayai
Tanpa mengira pelaksanaan, ungkapan berikut adalah benar:
(a / b) * b + (a % b) == a
Ungkapan ini menyatakan bahawa dividen (a) boleh dibina semula daripada hasil bagi (a / b) dan baki (a % b).
Penyelesaian
Satu pendekatan untuk memastikan tingkah laku yang konsisten bagi operan negatif ialah mengira baki seperti berikut:
<code class="cpp">int mod(int a, int b) { if (b < 0) return -mod(-a, -b); int ret = a % b; if (ret < 0) ret += b; return ret; }</code>
Fungsi ini mengendalikan operan negatif dengan menafikan kedua-dua operan dalam kes b adalah negatif. Bakinya dikira sebagai % b. Jika bakinya negatif, ia dilaraskan dengan menambah nilai mutlak b. Ini memastikan bahawa hasilnya adalah baki bukan negatif yang memenuhi ungkapan boleh dipercayai yang disebutkan di atas.
Dengan cara ini, mod(-1, 8) akan mengembalikan 7 dan mod(13, -8) akan kembali - 3, mematuhi tingkah laku matematik yang diharapkan.
Atas ialah kandungan terperinci Bagaimanakah Pengendali Modulus Mengendalikan Nombor Negatif dalam C/C /Obj-C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!