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:
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!