Rumah >pembangunan bahagian belakang >C++ >Mengapa Limpahan Integer Menghasilkan Keputusan Tidak Dijangka dalam C?

Mengapa Limpahan Integer Menghasilkan Keputusan Tidak Dijangka dalam C?

DDD
DDDasal
2024-11-12 16:47:01272semak imbas

Why Does Integer Overflow Produce Unexpected Results in C  ?

Hasil Tidak Dijangka dengan Limpahan Integer dalam C

Apabila bekerja dengan jenis integer, adalah penting untuk memahami implikasi limpahan. Dalam siaran ini, kami meneroka sebab limpahan integer yang ditandatangani dan tidak ditandatangani menghasilkan hasil yang tidak dijangka dalam atur cara C.

Pertimbangkan atur cara berikut yang menguji limpahan integer:

#include <iostream>

int main()
{
    int x(0);
    std::cout << x << std::endl;

    x = x + 2147483647;
    std::cout << x << std::endl;

    x = x + 1;
    std::cout << x << std::endl;
    std::cout << std::endl;

    unsigned int y(0);
    std::cout << y << std::endl;

    y = y + 4294967295;
    std::cout << y << std::endl;

    y = y + 1;
    std::cout << y << std::endl;
}

Outputnya mengejutkan:

0
2147483647
-2147483648

0
4294967295
0

Limpahan Integer yang Ditandatangani

Limpahan integer yang ditandatangani ialah gelagat yang tidak ditentukan. Ini bermakna bahawa pengkompil boleh melakukan apa sahaja yang dikehendakinya, termasuk menghasilkan hasil yang salah seperti dalam kes ini.

Limpahan Integer Tidak Ditandatangani

Sebaliknya, limpahan integer tidak ditandatangani adalah baik -ditakrifkan. Nilai itu membungkus, serupa dengan pembahagian modulo sebanyak 2^bits (di mana bit ialah bilangan bit dalam jenis data). Memandangkan kami mempunyai int 32-bit:

4294967295 + 1 = 4294967296 % 2^32 = 0

Butiran Pelaksanaan Khusus

Walaupun limpahan integer yang ditandatangani ialah gelagat yang tidak ditentukan, kebanyakan pelaksanaan menggunakan perwakilan pelengkap 2. Ini menerangkan keputusan khusus yang diperhatikan dalam program ini:

  • POS_MAX (nilai positif maksimum) = 7 (0111)
  • NEG_MAX (nilai negatif maksimum) = -8 (1000)

Apabila menambah 1 pada POS_MAX:

0111 + 1 = 1000

Memandangkan bit pendahulu ditetapkan, ia adalah nombor negatif. Untuk mencari nilai sebenar, kami melakukan songsang pelengkap 2:

1000 - 1 = 0111
~0111 = 1000 = -8

Oleh itu, nilai akhir ialah -8, yang muncul dalam output program.

Atas ialah kandungan terperinci Mengapa Limpahan Integer Menghasilkan Keputusan Tidak Dijangka 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