Use <iomanip>
's std::hex
. Si imprime, simplemente envíelo a std::cout
, si no, usestd::stringstream
std::stringstream stream;
stream << std::hex << your_int;
std::string result( stream.str() );
Puedes anteponer el primero <<
con << "0x"
o lo que quieras si lo deseas.
Otros manuales de interés son std::oct
(octal) ystd::dec
(de vuelta al decimal).
Un problema que puede encontrar es el hecho de que esto produce la cantidad exacta de dígitos necesarios para representarlo. Puede usar setfill
y setw
esto para evitar el problema:
stream << std::setfill ('0') << std::setw(sizeof(your_type)*2)
<< std::hex << your_int;
Finalmente, sugeriría tal función:
template< typename T >
std::string int_to_hex( T i )
{
std::stringstream stream;
stream << "0x"
<< std::setfill ('0') << std::setw(sizeof(T)*2)
<< std::hex << i;
return stream.str();
}
Kornel Kisielewicz
fuente
int
tipo;)std::setw
las necesidades a ser la salida a la corriente de todos los int, mientras questd::hex
,std::setfill
,std::uppercase
, ... sólo tienen que ser enviados a la corriente de salida de una vez. Esto parece inconsistente?Para hacerlo más ligero y rápido, sugiero usar el relleno directo de una cuerda.
fuente
double
yfloat
(y no para punteros)0000FFFF
para0xFFFF
. Prefiero tener0xFFFF
como salida.Úselo
std::stringstream
para convertir enteros en cadenas y sus manipuladores especiales para establecer la base. Por ejemplo así:fuente
Simplemente imprímalo como un número hexadecimal:
fuente
std::cout<<std::hex<<i<<std::dec;
, de lo contrario todos los enteros que se transmiten más adelante estarán en hexadecimal. No necesita hacer eso para las otras respuestas que usanstringstream
porque la secuencia se descarta después de usarse, perocout
vive para siempre.Puedes probar lo siguiente. Esta funcionando...
fuente
to_string
es parte del espaciostd
de nombres en C ++ 11Esta pregunta es antigua, pero me sorprende por qué nadie mencionó
boost::format
:fuente
fuente
Gracias al comentario de Lincoln a continuación, he cambiado esta respuesta.
La siguiente respuesta maneja correctamente las entradas de 8 bits en tiempo de compilación. Sin embargo, requiere C ++ 17. Si no tiene C ++ 17, tendrá que hacer otra cosa (por ejemplo, proporcionar sobrecargas de esta función, una para uint8_t y otra para int8_t, o usar algo además de "if constexpr", tal vez enable_if).
Respuesta original que no maneja entradas de 8 bits correctamente como pensé que lo hizo:
La respuesta de Kornel Kisielewicz es genial. Pero una pequeña adición ayuda a detectar casos en los que está llamando a esta función con argumentos de plantilla que no tienen sentido (por ejemplo, flotante) o que darían lugar a errores de compilación desordenados (por ejemplo, tipo definido por el usuario).
He editado esto para agregar una llamada a std :: to_string porque los tipos enteros de 8 bits (por ejemplo, los
std::uint8_t
valores pasados)std::stringstream
se tratan como char, lo que no le da el resultado que desea. Pasando esos enteros astd::to_string
manejarlos correctamente y no daña las cosas cuando se usan otros tipos de enteros más grandes. Por supuesto, es posible que sufra un ligero impacto en el rendimiento en estos casos, ya que la llamada std :: to_string es innecesaria.Nota: Hubiera agregado esto en un comentario a la respuesta original, pero no tengo el representante para comentar.
fuente
char
(que es distinto de ambosuint8_t
yint8_t
en la mayoría de las implementaciones (donde están respectivamenteunsigned char
ysigned char
)).... && !std::is_same_v<char, T> && !std::is_same_v<bool, T>
etc ...Para aquellos de ustedes que descubrieron que muchos / la mayoría de ellos
ios::fmtflags
no funcionan constd::stringstream
la idea de plantilla que Kornel publicó cuando, lo siguiente funciona y es relativamente limpio:fuente
Hago:
Eche un vistazo a la respuesta SO de iFreilicht y el archivo de encabezado de plantilla requerido desde aquí ¡ GIST !
fuente
Solo eche un vistazo a mi solución, [1] que copié textualmente de mi proyecto, por lo que hay un documento API alemán incluido. Mi objetivo era combinar flexibilidad y seguridad dentro de mis necesidades reales: [2]
0x
prefijo agregado: la persona que llama puede decidirlong long
[1] basado en la respuesta de Kornel Kisielewicz
[2] Traducido al lenguaje de CppTest , así es como se lee:
fuente
TEST_ASSERT(int_to_hex(short(0x12)) == "0012");
Código para su referencia:
fuente
clear
elsstream
(será destruido cuando la función regrese en la siguiente línea de todos modos). Puede evitar el nombre porhexStr
completo y soloreturn sstream.str();
sinclear
ing y obtener el mismo efecto, reduciendo cuatro líneas de código a una.sstream.clear();
? Elsstream
objeto se destruye automáticamente al final del alcance, porreturn sstream.str();
lo que lo haría.sstream.clear
solo borrará el contenido, antes de que la secuencia termine con el final del alcance (para borrar cualquier error y marcas de eof con clear). De hecho, cuando el alcance muere, con la vida útil de la variable de flujo, y porsstream.str
lo tanto, se puede utilizar para devolver por valor. [Referencia: cplusplus.com/reference/ios/ios/clear/]Mi solución. Solo se permiten tipos integrales.
Actualizar. Puede establecer el prefijo opcional 0x en el segundo parámetro.
definición.h
main.cpp
Resultados:
0xfe
0xfe
0xfffffffe
0xfffffffffffffffe
fe
fe fffffffe
fffffffffffffffe
fuente
Me gustaría agregar una respuesta para disfrutar de la belleza del lenguaje C ++. Su adaptabilidad para trabajar en niveles altos y bajos. Feliz programación
Ejemplos:
fuente
Usando puntero vacío:
Agregando 0x:
Salidas:
fuente
0x69fec4 (dirección)
6946500 (dirección a dec)
0x69fec4 (dirección a dec, salida en hexadecimal)
instintivamente fue con esto ...
int address = (int) & var;
vi esto en otro lado ...
unsigned long address = reinterpret_cast (& var);
el comentario me dijo que esto es correcto ...
int address = (int) & var;
hablando de ligereza bien cubierta , ¿dónde estás? ¡están recibiendo demasiados me gusta!
fuente
unsigned long
sinostd::intptr_t
.intptr_t
puede almacenar cualquier puntero en la plataforma de compilación; eso no es [necesariamente] cierto deunsigned int
. Y, de nuevo, nada de esto es relevante para la pregunta. No hay más respuestas de mi parte