Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah Mendarab Huruf Integer dalam Tugasan `long long long` Membawa kepada Limpahan?

Mengapakah Mendarab Huruf Integer dalam Tugasan `long long long` Membawa kepada Limpahan?

DDD
DDDasal
2024-11-08 08:28:01481semak imbas

Why Does Multiplying Integer Literals in a `long long int` Assignment Lead to Overflow?

Limpahan dalam Tugasan Long Long Int: Mengapa Mendarab Huruf Integer Gagal

Dalam coretan kod yang disediakan, tiga penetapan integer panjang panjang dicuba:

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

Sementara tugasan ketiga berjaya, mengapa limpahan pertama walaupun menggunakan int panjang yang panjang?

Memahami Jenis Integer

Sebab limpahan terletak pada sifat jenis integer. Secara lalai, literal integer diberikan jenis terkecil yang boleh mewakili nilainya tanpa lebih kecil daripada int. Dalam kes yang diberikan, 2000 ialah int, yang biasanya menduduki 32 bit pada kebanyakan sistem.

Peraturan Pendaraban

Pengendali aritmetik, seperti pendaraban, digunakan dengan lebih besar daripada dua jenis yang terlibat, tetapi tidak lebih kecil daripada int. Contohnya:

  • char * char akan memanggil operator*(int,int) -> int
  • char * int akan memanggil operator*(int,int) -> int
  • long * int akan memanggil operator*(long,long) -> panjang

Walau bagaimanapun, int * int masih memanggil operator*(int,int) -> int.

Taip Promosi dan Limpahan

Dalam tugasan yang melimpah, 2000*2000*2000*2000 melibatkan pendaraban 4 nilai int, menghasilkan integer lebih besar daripada int apa boleh tahan. Walaupun keputusan akhir disimpan dalam pembolehubah int panjang yang panjang, pendaraban berlaku dengan int.

Menyelesaikan Limpahan

Untuk mengelakkan limpahan, seseorang boleh menggunakan yang berikut pendekatan:

  • Gunakan 2000LL secara eksplisit, yang mewakili int panjang yang panjang literal.
  • Gunakan pow(2000,4) untuk melakukan pengiraan sebagai dua kali ganda dan kemudian tetapkan kepada pembolehubah int long long.
  • Tetapkan nilai integer besar secara langsung, seperti 16000000000000, kepada pembolehubah long long int.

Atas ialah kandungan terperinci Mengapakah Mendarab Huruf Integer dalam Tugasan `long long long` Membawa kepada Limpahan?. 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