Rumah >pembangunan bahagian belakang >C++ >Mengapakah mendarab pemalar literal integer melimpah walaupun apabila menetapkan kepada pembolehubah `long long`?

Mengapakah mendarab pemalar literal integer melimpah walaupun apabila menetapkan kepada pembolehubah `long long`?

Barbara Streisand
Barbara Streisandasal
2024-11-11 06:08:02715semak imbas

Why does multiplying integer literal constants overflow even when assigning to a `long long` variable?

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!

Kenyataan:
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