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

Barbara Streisand
Lepaskan: 2024-11-11 06:08:02
asal
666 orang telah melayarinya

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

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

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

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!

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