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

Mengapa Limpahan Integer Menghasilkan Keputusan Tidak Dijangka dalam C?

DDD
Lepaskan: 2024-11-12 16:47:01
asal
218 orang telah melayarinya

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

Outputnya mengejutkan:

0
2147483647
-2147483648

0
4294967295
0
Salin selepas log masuk

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

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

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

1000 - 1 = 0111
~0111 = 1000 = -8
Salin selepas log masuk

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan