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
Lepaskan: 2024-10-31 21:24:02
asal
785 orang telah melayarinya

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

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

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

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!

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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!