Outils pour utilisateurs

Outils du site


lang:c:cast

Cast implicite

int i = 0xFFFF;
unsigned char c = i;

Cast explicite lors de la déclaration

Définir un nombre non signé :

unsigned int i = 0xFFFFFFFFU;

Définir un nombre 64 bits :

unsigned long i = 0xFFFFFFFFFFFFFFFFLU;

Définir un nom flottant (et par un double)

float f = 0.1f;

Cast explicite lors de la conversion (C uniquement)

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 entre parenthèses le type de destination.

Il peut être aussi nécessaire de réajuster un pointeur pour l'utiliser dans une fonction.

const char * t = "coucou";
 
void f(unsigned char * tt)
{
}
 
int main()
{
  f((unsigned char *)t);
}

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);
}
lang/c/cast.txt · Dernière modification : 2020/03/04 08:21 de root