Memahami Limpahan Integer Panjang Panjang dalam Aritmetik C
Pertimbangkan coretan kod berikut:
long long int n = 2000 * 2000 * 2000 * 2000; // overflow
Mengapa ini berlaku kod menghasilkan limpahan, walaupun pengisytiharan pembolehubah panjang yang panjang untuk menahan hasilnya?
Sebab Limpahan
Isunya terletak pada jenis literal integer pemalar 2000. Secara lalai, literal integer diberikan jenis terkecil yang boleh menyimpan nilainya tanpa lebih kecil daripada int. Memandangkan tahun 2000 boleh disimpan dalam int 32-bit, operasi aritmetik pada literal ini dilakukan sebagai operasi int.
Taip Promosi
Walaupun pembolehubah panjang panjang seperti n can menyimpan nilai yang lebih besar, operator aritmetik dipanggil dengan jenis yang lebih besar yang terdapat dalam operasi pendaraban. Walau bagaimanapun, dalam kes ini, jenis yang lebih besar kekal int, tanpa mengira jenis destinasi.
Implikasi untuk Limpahan
Ini bermakna hasil darab 2000 * 2000 * 2000 * 2000 dikira sebagai integer 32-bit, yang melimpah kerana hasilnya melebihi nilai maksimum yang boleh disimpan oleh int.
Pendekatan Alternatif
Untuk mengelakkan ini limpahan, anda boleh secara eksplisit menghantar literal integer ke panjang panjang menggunakan akhiran LL untuk pemalar literal atau operator cast eksplisit (panjang panjang):
long long int n = (long long)2000 * 2000 * 2000 * 2000; // no overflow
Sebagai alternatif, anda boleh menggunakan fungsi pow untuk mengira hasilnya , memastikan pengiraan dilakukan dengan nilai panjang panjang:
long long int n = pow(2000, 4); // no overflow
Dengan menghantar atau menggunakan fungsi pow secara eksplisit, anda memastikan pengiraan dilakukan dengan nilai panjang panjang, menghalang limpahan.
Atas ialah kandungan terperinci Mengapakah Mendarab Huruf Integer Menghasilkan Limpahan Walaupun dengan Pembolehubah `panjang panjang`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!