Outils pour utilisateurs

Outils du site


lang:c:cast

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
lang:c:cast [2020/03/03 21:03] – Création rootlang:c:cast [2020/03/04 08:21] (Version actuelle) – Ajout des cast explicite pour les nombres root
Ligne 6: Ligne 6:
 </code> </code>
  
-===Cast explicite=== +===Cast explicite lors de la déclaration=== 
- +Définir un nombre non signé : 
-Ici, un cast explicite est nécessaire si ''-Wconversion'' est activé car une perte de précision est prévisible entre ''double'' et ''float''.+<code c> 
 +unsigned int i = 0xFFFFFFFFU; 
 +</code>
  
 +Définir un nombre 64 bits :
 <code c> <code c>
-double d 0.1; +unsigned long i 0xFFFFFFFFFFFFFFFFLU;
-float f = (float)d;+
 </code> </code>
  
-Un cast se fait tout simplement en ajoutant les parenthèses. +Définir un nom flottant (et par un double)
- +
-===Gérer les dépassements de limites=== +
 <code c> <code c>
-int k 0x7fffffff; +float f 0.1f;
-k += 150;+
 </code> </code>
  
-Si on compile le programme avec ''-fsanitize=undefined'', on aura le message d'erreur : ''runtime error: signed integer overflow: 2147483647 + 150 cannot be represented in type 'int%%'%%''+===Cast explicite lors de la  conversion (C uniquement)===
  
-Il n'est pas possible de gérer ces dépassements par un cast. Il est nécessaire d'utiliser les fonctions de contrôles ''%%__%%builtin_add_overflow'', ''%%__%%builtin_sub_overflow'' et ''%%__%%builtin_mul_overflow''.+Ici, un cast explicite est nécessaire si ''-Wconversion'' est activé car une perte de précision est prévisible entre ''double'' et ''float''.
  
 <code c> <code c>
-int k 0x7fffffff+double d 0.1
-= (int)(k + 150);+float f = (float)d;
 </code> </code>
  
-===Réajuster un pointeur pour l'utiliser dans une fonction===+Un cast se fait tout simplement en ajoutant entre parenthèses le type de destination. 
 + 
 +Il peut être aussi nécessaire de réajuster un pointeur pour l'utiliser dans une fonction.
  
 <code c> <code c>
 const char * t = "coucou"; const char * t = "coucou";
  
-void f(char * tt)+void f(unsigned char * tt)
 { {
 } }
Ligne 44: Ligne 44:
 int main() int main()
 { {
-  f((char *)t);+  f((unsigned char *)t);
 }</code> }</code>
 +
 +===Gérer les dépassements de limites===
 +
 +<code c>
 +int k = 0x7fffffff;
 +k += 150;
 +</code>
 +
 +Si on compile le programme avec ''-fsanitize=undefined'', on aura le message d'erreur : ''runtime error: signed integer overflow: 2147483647 + 150 cannot be represented in type 'int%%'%%''
 +
 +Il n'est pas possible de gérer ces dépassements par un cast. Il est nécessaire d'utiliser les fonctions de contrôles ''%%__%%builtin_add_overflow'', ''%%__%%builtin_sub_overflow'' et ''%%__%%builtin_mul_overflow''. Ces trois fonctions renvoient ''true'' quand un overflow est détectée (à partir de gcc 5.0 et clang 3.8).
 +
 +<code c>
 +int main() {
 +  int k = 0x7fffffff;
 +  // true car overflow
 +  return __builtin_add_overflow(k, 150, &k);
 +}
 +</code>
lang/c/cast.1583265817.txt.gz · Dernière modification : 2020/03/03 21:03 de root