Rumah >pembangunan bahagian belakang >C++ >Mengapa Pendaraban Integer Membawa kepada Limpahan dalam C?

Mengapa Pendaraban Integer Membawa kepada Limpahan dalam C?

Susan Sarandon
Susan Sarandonasal
2024-11-11 15:12:03991semak imbas

Why Does Integer Multiplication Lead to Overflow in C  ?

Limpahan Integer: Apabila Pendaraban Membawa kepada Bencana

Dalam C , adalah penting untuk memahami saiz dan jenis integer untuk mengelakkan kemungkinan limpahan. Mari kita periksa coretan kod berikut:

long long int n = 2000*2000*2000*2000;    // overflow

long long int n = pow(2000,4);            // works
long long int n = 16000000000000;         // works

Mengapa baris pertama mengakibatkan limpahan, manakala dua yang lain berfungsi tanpa masalah?

Penyebabnya terletak pada cara C mengendalikan literal integer dan operasi aritmetik. Secara lalai, literal integer adalah jenis terkecil yang boleh menyimpan nilainya tetapi tidak lebih kecil daripada int. Dalam kes ini, 2000 ialah int, biasanya jenis 32-bit.

Apabila menjalankan operasi aritmetik, pengkompil mengikut peraturan khusus berdasarkan jenis operan. Dalam senario ini, pendaraban dilakukan dengan int, iaitu jenis yang lebih besar daripada jenis yang terlibat. Walau bagaimanapun, tugasan adalah tidak relevan kerana C tidak membuat kesimpulan jenis berdasarkan destinasi.

Hasil pendaraban, yang melebihi kapasiti int, disimpan sebagai int, yang membawa kepada limpahan. Inilah sebabnya mengapa baris pertama mencetuskan limpahan, manakala dua yang lain tidak.

Untuk menyelesaikan isu ini, kita boleh menentukan secara eksplisit jenis pemalar yang digunakan dalam baris pertama dengan menambahkan akhiran LL (atau ll ). Ini memastikan bahawa literal dianggap sebagai int panjang yang panjang, menghalang limpahan.

Dengan memahami cara jenis integer dan operasi aritmetik berfungsi dalam C , kami boleh mengelakkan kemungkinan perangkap dan memastikan kod kami mengendalikan manipulasi data dengan betul.

Atas ialah kandungan terperinci Mengapa Pendaraban Integer Membawa kepada Limpahan dalam C?. 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