Maison >développement back-end >C++ >Pourquoi le dépassement d'entier en C conduit-il à des résultats différents pour les entiers signés et non signés ?
Résultats inattendus d'un dépassement d'entier signé/non signé
En C, un dépassement d'entier peut conduire à des résultats inattendus en fonction de la signature du type de données .
Considérez ce qui suit programme :
#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; }
Le résultat de ce programme peut vous surprendre :
0 2147483647 -2147483648 0 4294967295 0
Explication
Pour entiers signés, le comportement de débordement n'est pas défini. Dans la plupart des implémentations, le complément à 2 est utilisé, ce qui conduit à un comportement de bouclage inattendu. Par exemple, dans le programme ci-dessus :
Pour entiers non signés, le débordement est bien défini et s'enroule modulo 2bits. Autrement dit, la valeur est remise à 0 en cas de dépassement du maximum. Cela explique le résultat de y, où y revient à 0 après avoir dépassé la valeur non signée maximale, 4294967295.
Il est important de noter que le comportement du dépassement d'entier signé n'est pas garanti par le langage et peut varier en fonction de la mise en œuvre et l'architecture de la machine. Par conséquent, il n'est généralement pas recommandé de s'appuyer sur un tel comportement dans vos programmes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!