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?
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.static_cast
, const_cast
et reinterpret_cast
est nécessaire pour faire le travail.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:
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.