Maison >développement back-end >C++ >Pourquoi ce code de dépassement d'entier entraîne-t-il une boucle infinie dans GCC sur x86 ?
Comprendre le débordement d'entier dans GCC sur x86
Problème :
Le code fourni entre un boucle infinie sur GCC lors d'une tentative de débordement d'entier avec un x86 architecture :
int i = 0x10000000; while (i > 0) { i += i; }
Raison :
Le débordement d'entier dans GCC sur x86 est un comportement indéfini et le comportement observé peut varier. GCC implémente généralement l'arithmétique entière à l'aide d'instructions entières x86, qui s'enroulent généralement en cas de débordement. Cependant, dans ce cas, le compilateur suppose que le débordement n'est pas prévu et effectue des optimisations qui aboutissent à une boucle infinie.
Solution :
Pour garantir un comportement de bouclage , un contrôle explicite des débordements est nécessaire. Ceci peut être réalisé en :
Implémentations alternatives :
Explication du code :
Le code assembleur de la boucle problématique révèle que le compilateur optimise le test de boucle en partant de l'hypothèse que le débordement ne se produira pas se produire. Du coup, la boucle continue indéfiniment.
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!