lang:c:cast
Ceci est une ancienne révision du document !
Cast implicite
int i = 0xFFFF; unsigned char c = i;
Cast explicite
Ici, un cast explicite est nécessaire si -Wconversion
est activé car une perte de précision est prévisible entre double
et float
.
double d = 0.1; float f = (float)d;
Un cast se fait tout simplement en ajoutant les parenthèses.
Gérer les dépassements de limites
int k = 0x7fffffff; k += 150;
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).
int main() { int k = 0x7fffffff; // true car overflow return __builtin_add_overflow(k, 150, &k); }
Réajuster un pointeur pour l'utiliser dans une fonction
const char * t = "coucou"; void f(char * tt) { } int main() { f((char *)t); }
lang/c/cast.1583272834.txt.gz · Dernière modification : 2020/03/03 23:00 de root