sprintf - casting int to char usando casting de estilo C++
itoa c++ (4)
Debe usar static_cast<char>(i)
para convertir el entero i
en char
.
reinterpret_cast
casi nunca debe usarse, a menos que desee convertir un tipo en un tipo fundamentalmente diferente.
Además, reinterpret_cast
depende de la máquina, por lo que su uso seguro requiere una comprensión completa de los tipos, así como la forma en que el compilador implementa la conversión.
Para más información sobre el casting de C ++ vea:
Esta pregunta ya tiene una respuesta aquí:
En C tradicional puedes hacer:
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).
¿Cuál de los métodos de conversión de c ++ (static_cast, reinterpret_cast) es adecuado para realizar este trabajo?
El uso de reparto estático probablemente resultaría en algo como esto:
// This does not prevent a possible type overflow
const char char_max = -1;
int i = 48;
char c = (i & char_max);
Para evitar un posible desbordamiento de tipos, puede hacer esto:
const char char_max = (char)(((unsigned char) char(-1)) / 2);
int i = 128;
char c = (i & char_max); // Would always result in positive signed values.
Donde reinterpret_cast probablemente solo se convertiría directamente a char, sin ningún tipo de seguridad de lanzamiento. -> Nunca use reinterpret_cast si también puede usar static_cast. Si está lanzando entre clases, static_cast también se asegurará de que los dos tipos coincidan (el objeto es un derivado del tipo de conversión).
Si su objeto es de tipo polimórfico y no sabe cuál es, debe usar dynamic_cast, que realizará una verificación de tipo en tiempo de ejecución y devolverá nullptr si los tipos no coinciden.
Si necesita const_cast, lo más probable es que haya hecho algo mal y debe pensar en posibles alternativas para corregir la corrección de const en su código.
Puede convertir implícitamente entre tipos numéricos, incluso cuando eso pierde precisión:
char c = i;
Sin embargo, es posible que desee habilitar las advertencias del compilador para evitar conversiones con pérdidas como esta. Si lo haces, entonces usa static_cast
para la conversión.
De los otros moldes:
-
dynamic_cast
solo funciona para punteros o referencias a tipos de clases polimórficas; -
const_cast
no puede cambiar los tipos, soloconst
o calificadoresvolatile
; -
reinterpret_cast
es para circunstancias especiales, la conversión entre punteros o referencias y tipos completamente no relacionados. Específicamente, no hará conversiones numéricas. - Los modelos de estilo C y de estilo de función hacen cualquier combinación de
static_cast
,const_cast
yreinterpret_cast
para hacer el trabajo.
reinterpret_cast
no se puede utilizar para esta conversión, el código no se compilará. Según la sección 5.2.10-1 del estándar C ++ 03:
Conversions that can be performed explicitly using reinterpret_cast are listed below. No other conversion can be performed explicitly using reinterpret_cast.
Esta conversión no está listada en esa sección. Incluso esto no es válido:
long l = reinterpret_cast<long>(i)
static_cast
es el que debe usarse aquí. Vea esto y esto tan preguntas.