Pendaraban Panjang yang Melimpah
Pertimbangkan kod berikut:
long long int n = 2000*2000*2000*2000; // overflow
Mengapa kod ini mengakibatkan limpahan apabila mendarab pemalar literal integer dan memberikan hasil kepada pembolehubah panjang yang panjang?
Berbanding dengan yang berikut yang berfungsi:
long long int n = pow(2000,4); // works long long int n = 16000000000000; // works
Literal integer dalam C mempunyai jenis lalai yang bergantung pada nilainya . Dalam kes ini, 2000 boleh dimuatkan dalam pembolehubah int, yang biasanya jenis 32-bit.
Operasi aritmetik dilakukan dengan jenis operan yang lebih besar, tetapi tidak lebih kecil daripada int. Oleh itu, dalam kes pertama, pendaraban dilakukan sebagai int*int, menghasilkan hasil int.
Masalah timbul kerana hasil int mungkin melimpah, tetapi kod cuba menyimpannya dalam pembolehubah panjang yang panjang . C tidak membuat kesimpulan jenis berdasarkan destinasi, jadi tugasan tidak menghalang limpahan.
Untuk mengelakkan isu ini, anda boleh secara eksplisit menghantar literal integer ke panjang lama sebelum mendarabnya:
long long int n = (long long int)2000*2000*2000*2000;
Atas ialah kandungan terperinci Mengapakah mendarab pemalar literal integer melimpah walaupun apabila menetapkan kepada pembolehubah `long long`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!