← Retour au blog
tech 30 juillet 2026

La conversion float-vers-int en C++ : un comportement indéfini à surveiller

La conversion d'un float en int en C++ peut entraîner un comportement indéfini quand la valeur ne rentre pas dans l'entier cible. Découvre pourquoi et comment éviter ce piège dans ton code.

Article inspiré de la source originale
C++ float-to-int conversion can be undefined behavior ↗ kttnr.net

Introduction

En C++, convertir un float en int semble anodin. C'est une opération courante, mais elle cache un piège potentiel : le comportement indéfini. Quand la valeur tronquée du float ne rentre pas dans l'entier cible, le résultat est imprévisible. Pourtant, beaucoup de développeurs passent à côté de ce détail crucial.

Le problème : comportement indéfini

En C++, lorsqu'un float est converti en int, la partie fractionnaire est supprimée. Cependant, si la valeur entière dépasse la capacité de l'int, le comportement devient indéfini. Cela signifie que le programme peut donner des résultats différents selon le matériel ou le compilateur utilisé. Par exemple, sur un processeur x86, une valeur non représentable peut être convertie en INT_MIN.

Exemples concrets

Prenons le code suivant : ``cpp void foo(float f) { int i0 = f; int i1 = int(f); int i2 = static_cast<int>(f); } `` Ce code ne génère aucun avertissement même avec les options -Wall et -Wextra activées. Pourtant, chacune de ces conversions peut causer un comportement indéfini pour certains inputs.

Pourquoi c'est problématique

La diversité des résultats sur différents matériels n'est qu'une partie du problème. Plus important encore, n'importe quel comportement indéfini qui s'exécute est dangereux. Comme l'explique Ralf Jung, ce que fait le matériel ne reflète pas toujours ce que fait votre programme.

Solutions pratiques

La bonne approche est de vérifier les bornes avant la conversion. Voici comment :

```cpp bool canRepresentAsInt(float f) { return f >= static_cast<float>(std::numeric_limits<int>::min()) && f <= static_cast<float>(std::numeric_limits<int>::max()); }

int safeFloatToInt(float f) { if (!canRepresentAsInt(f)) { throw std::out_of_range("Le float ne peut pas être représenté en int"); } return static_cast<int>(f); } ```

Utiliser les outils de détection

Utilise les outils de détection comme le Undefined Behavior Sanitizer avec -fsanitize=float-cast-overflow pour identifier ces problèmes dans ton code.

Conclusion

S'assurer que les conversions float-vers-int sont sûres est essentiel pour éviter des bugs difficiles à traquer. En vérifiant les bornes et en utilisant des outils de détection, tu peux protéger ton code contre ces comportements indéfinis. Discutons de ton projet en 15 minutes.

C++ float-to-int conversion undefined behavior programming errors code safety
Newsletter Deepthix · 100% IA · chaque lundi 8h

Un agent IA lit la tech à ta place.

Notre agent IA scanne ~200 sources par semaine et te livre les meilleurs articles le lundi 8h. Gratuit. 1 clic pour se désinscrire.

Voir la page newsletter →

Tu veux automatiser tes opérations ?

Discutons de ton projet en 15 minutes.

Réserver un call