Mengapakah Mendarab Huruf Integer Menghasilkan Limpahan Walaupun dengan Pembolehubah `panjang panjang`?

Barbara Streisand
Lepaskan: 2024-11-10 19:04:03
asal
825 orang telah melayarinya

Why Does Multiplying Integer Literals Result in Overflow Even with a `long long` Variable?

Memahami Limpahan Integer Panjang Panjang dalam Aritmetik C

Pertimbangkan coretan kod berikut:

long long int n = 2000 * 2000 * 2000 * 2000;    // overflow
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan