Rumah >pembangunan bahagian belakang >C++ >Mengapa limpahan integer menghasilkan tingkah laku yang berbeza untuk integer yang ditandatangani dan tidak ditandatangani?
Memahami Limpahan Integer Ditandatangani/Tidak Ditandatangani
Dalam proses pembelajaran tentang limpahan integer dalam C , soalan berikut timbul:
Mengapa saya memperoleh hasil ini dengan limpahan integer yang ditandatangani/tidak ditandatangani?"
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:
0 2147483647 -2147483648 0 4294967295 0
Penjelasan:
Memahami limpahan integer dalam C memerlukan pemahaman tentang jenis integer bertanda dan tidak bertanda.
Limpahan integer yang ditandatangani dianggap tingkah laku tidak ditentukan, bermakna pengkompil tidak perlu menentukan gelagat yang tepat apabila integer yang ditandatangani melimpah. Dalam amalan, kebanyakan pelaksanaan menyimpan integer yang ditandatangani menggunakan perwakilan pelengkap 2 Ini bermakna apabila integer yang ditandatangani melimpah, nilainya "bergulung" kepada julat negatif Dalam contoh, menambah 1 kepada integer positif maksimum (2147483647) menggunakan tandatangan. integer menghasilkan -2147483648, integer negatif minimum.
Sebaliknya, limpahan integer tidak ditandatangani ialah baik -defined, dengan nilai dibalut kepada sifar apabila ia melebihi nilai maksimum. Dalam contoh, menambah 1 pada integer tidak bertanda maksimum (4294967295) menghasilkan 0. Ini kerana integer tidak bertanda tidak mempunyai konsep nilai negatif.
Atas ialah kandungan terperinci Mengapa limpahan integer menghasilkan tingkah laku yang berbeza untuk integer yang ditandatangani dan tidak ditandatangani?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!