Je développe du C++ sous Windows avec le compilateur Visual Studio, plus précisément Visual Studio 2015 Update 3.
Pour certains travaux liés au DSP, j'utilise unsigned int / unsigned long type de données. Je me demandais quelle était la différence entre ces deux types de données intégrés dans C/C++.
J'ai cherché un peu sur Google et SO et j'ai trouvé ces références.
- Types de documentation sur cppreference.com
- Types de documentation sur MSDN pour Visual Studio 2015
- Types de documentation pour GNU C/C++ (en tant que Compilateur G++ a indiqué que C/C++ utilisent la même implémentation de type par défaut, je me réfère à la documentation C ici)
Je suppose que la documentation cppreference est le résumé de la norme ISO C++11. Donc, d'après la "norme" non signé et unsigned int sont de 16/32 bits selon le modèle de données LP/ILP 32/64 alors que unsigned long et unsigned long int sont de 32/64 bits selon le modèle de données LP/ILP 32/64.
Les documentations MSDN et GNU indiquent toutes que unsigned int / unsigned long utilisent une implémentation 32 bits et peuvent contenir des valeurs allant jusqu'à 4 294 967 295. Cependant, la documentation de GNU indique également que, selon votre système, unsigned long peut être de 64 bits, ce qui est identique à unsigned long long int.
Mes questions sont donc les suivantes :
- Pour un long non signé de 64 bits, dépasser le plafond de 4 294 967 295 est-il un comportement indéfini ou un comportement correct ?
- Si j'ai une application fonctionnant sur un système Windows et compilée dans Visual Studio, les fonctions de base sont les suivantes non signé \== unsigned long . Vrai ou faux ?
- Si j'ai une application compilée par le compilateur GNU fonctionnant sous Linux/Windows, je dois m'assurer que unsigned long \== unsigned int o unsigned long \== unsigned long long long afin d'éviter tout débordement de données. Vrai ou faux
- Si j'ai une application multiplateforme susceptible d'être compilée par tous ces compilateurs Visual Studio/GNU/Clang/Intel, je dois clairement classer l'environnement avec un grand nombre de préprocesseurs pour éviter les débordements de données. Vrai ou faux
Merci d'avance.
Edita: Merci à @PeterRuderman d'avoir signalé que le dépassement de la valeur plafond pour les types non signés n'est pas un comportement indéfini.
Dans ce cas, ma question 1 sera modifiée :
- Pour un long non signé de 64 bits, le fait de dépasser le plafond de 4 294 967 295 entraînera-t-il un enroulement ?