Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah menghantar nilai integer paling negatif kepada fungsi terlampau beban dalam C membawa kepada ralat kekaburan, walaupun mencetak nilai secara langsung berfungsi dengan betul?

Mengapakah menghantar nilai integer paling negatif kepada fungsi terlampau beban dalam C membawa kepada ralat kekaburan, walaupun mencetak nilai secara langsung berfungsi dengan betul?

Patricia Arquette
Patricia Arquetteasal
2024-10-31 21:24:02788semak imbas

Why does passing the most negative integer value to an overloaded function in C   lead to an ambiguity error, even though printing the value directly works correctly?

Lebihan Fungsi Samar-samar untuk Nilai Integer Paling Negatif

Dalam C , lebihan fungsi membenarkan berbilang fungsi dengan nama yang sama tetapi parameter berbeza. Walau bagaimanapun, kekaburan timbul apabila pengkompil tidak dapat menentukan fungsi terlampau beban untuk digunakan berdasarkan hujah yang diberikan. Isu ini boleh berlaku apabila bekerja dengan jenis integer, terutamanya apabila berurusan dengan nilai paling negatif.

Pertimbangkan coretan kod berikut:

<code class="c++">void display(int a)
{
    cout << "int" << endl;
}

void display(unsigned a)
{
    cout << "unsigned" << endl;
}

int main()
{
    int i = -2147483648;
    cout << i << endl; //will display -2147483648
    display(-2147483648);
}

Menurut pemahaman kami tentang lebihan muatan, sebarang nilai dalam julat integer (4 bait dalam kes ini) harus menggunakan fungsi paparan(int). Nilai di luar julat ini akan membawa kepada kekaburan. Walau bagaimanapun, menyusun kod ini menghasilkan ralat berikut:

call of overloaded `display(long int)` is ambiguous

Ralat ini timbul apabila menghantar nilai integer paling negatif (-2147483648) kepada fungsi paparan. Anehnya, mencetak nilai yang sama secara langsung (seperti yang dilihat pada baris 6) menghasilkan hasil yang betul: -2147483648.

Kehalusan: Kekurangan Huruf Negatif dalam C

The kunci untuk memahami tingkah laku ini terletak pada ketiadaan literal negatif dalam C . Semua literal integer dalam C dianggap sebagai tidak ditandatangani secara lalai, bermakna ia tidak mempunyai awalan tanda (- atau ). Akibatnya, -2147483648 sebenarnya dianggap sebagai -1 * (2147483648).

Implikasi untuk Fungsi Terlebih Beban

Sejak 2147483648 integer (4 bytes integer melebihi julat anteger ), ia dinaikkan pangkat kepada integer panjang. Ini bermakna bahawa pengkompil cuba menggunakan fungsi paparan(int panjang), yang bercanggah dengan beban paparan(int) sedia ada. Oleh itu, kekaburan timbul.

Resolusi

Untuk mengelakkan kekaburan ini, adalah disyorkan untuk menggunakan kelas std::numeric_limits untuk mendapatkan nilai minimum dan maksimum khusus jenis :

<code class="c++">std::cout << std::numeric_limits<int>::min() << endl; // displays -2147483648</code>

Atas ialah kandungan terperinci Mengapakah menghantar nilai integer paling negatif kepada fungsi terlampau beban dalam C membawa kepada ralat kekaburan, walaupun mencetak nilai secara langsung berfungsi dengan betul?. 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