Hasil Tidak Dijangka daripada Limpahan Integer Ditandatangani/Tidak Ditandatangani
Dalam C , limpahan integer boleh membawa kepada hasil yang tidak dijangka bergantung pada tanda jenis data .
Pertimbangkan perkara berikut program:
#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; }
Output program ini mungkin mengejutkan anda:
0 2147483647 -2147483648 0 4294967295 0
Penjelasan
Untuk integer yang ditandatangani, tingkah laku limpahan tidak ditentukan. Dalam kebanyakan pelaksanaan, pelengkap 2 digunakan, yang membawa kepada gelagat pembungkusan yang tidak dijangka. Sebagai contoh, dalam atur cara di atas:
Untuk integer tidak bertanda, limpahan ditakrifkan dengan baik dan melilit modulo 2bit. Dalam erti kata lain, nilai ditetapkan semula kepada 0 apabila melebihi maksimum. Ini menerangkan output untuk y, di mana y dililitkan kepada 0 selepas melimpahi nilai maksimum yang tidak ditandatangani, 4294967295.
Adalah penting untuk ambil perhatian bahawa kelakuan untuk limpahan integer yang ditandatangani tidak dijamin oleh bahasa dan mungkin berbeza-beza bergantung pada pelaksanaan dan seni bina mesin. Oleh itu, biasanya tidak disyorkan untuk bergantung pada tingkah laku sedemikian dalam program anda.
Atas ialah kandungan terperinci Mengapakah limpahan integer dalam C membawa kepada hasil yang berbeza untuk integer yang ditandatangani dan tidak ditandatangani?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!