web-dev-qa-db-fra.com

casting int à char en utilisant le casting de style C ++

En C traditionnel, vous pouvez faire:

int i = 48;
char c = (char)i;
//Now c holds the value of 48. 
//(Of course if i > 255 then c will not hold the same value as i).  

Laquelle des méthodes de diffusion c ++ (static_cast, reinterpret_cast) est appropriée pour effectuer ce travail?

20
Subway

Vous pouvez implicitement convertir entre les types numériques, même si cela perd de la précision:

char c = i;

Cependant, vous voudrez peut-être activer les avertissements du compilateur pour éviter de telles conversions avec perte. Si vous le faites, utilisez static_cast pour la conversion.

Parmi les autres moulages:

  • dynamic_cast ne fonctionne que pour les pointeurs ou les références aux types de classes polymorphes;
  • const_cast ne peut pas changer les types, seulement const ou volatile qualificateurs;
  • reinterpret_cast est destiné à des circonstances spéciales, la conversion entre des pointeurs ou des références et des types complètement non liés. Plus précisément, il ne fera pas de conversions numériques.
  • Les casts de style C et de style fonctionnel font quelle que soit la combinaison de static_cast, const_cast et reinterpret_cast est nécessaire pour faire le travail.
13
Mike Seymour

Vous devez utiliser static_cast<char>(i) pour convertir l'entier i en char.

reinterpret_cast ne devrait presque jamais être utilisé, à moins que vous souhaitiez transformer un type en un type fondamentalement différent.

Également reinterpret_cast dépend de la machine, son utilisation en toute sécurité nécessite donc une compréhension complète des types et de la manière dont le compilateur implémente la conversion.

Pour plus d'informations sur le transtypage C++, voir:

22
Snps

reinterpret_cast ne peut pas être utilisé pour cette conversion, le code ne sera pas compilé. Selon la norme C++ 03, section 5.2.10-1:

Conversions that can be performed explicitly using reinterpret_cast are listed below. No other conversion can be performed explicitly using reinterpret_cast.

Cette conversion ne figure pas dans cette section. Même ceci est invalide:

long l = reinterpret_cast<long>(i)

static_cast est celui qui doit être utilisé ici. Voir this et this SO questions.

0
Sanish