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 setfilly setwesto 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
                    
                 
                
                 
inttipo;)std::setwlas 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
doubleyfloat(y no para punteros)0000FFFFpara0xFFFF. Prefiero tener0xFFFFcomo salida.Úselo
std::stringstreampara 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 usanstringstreamporque la secuencia se descarta después de usarse, perocoutvive para siempre.Puedes probar lo siguiente. Esta funcionando...
fuente
to_stringes parte del espaciostdde 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_tvalores pasados)std::stringstreamse tratan como char, lo que no le da el resultado que desea. Pasando esos enteros astd::to_stringmanejarlos 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_tyint8_ten la mayoría de las implementaciones (donde están respectivamenteunsigned charysigned 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::fmtflagsno funcionan constd::stringstreamla 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]
0xprefijo 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
clearelsstream(será destruido cuando la función regrese en la siguiente línea de todos modos). Puede evitar el nombre porhexStrcompleto y soloreturn sstream.str();sinclearing y obtener el mismo efecto, reduciendo cuatro líneas de código a una.sstream.clear();? Elsstreamobjeto se destruye automáticamente al final del alcance, porreturn sstream.str();lo que lo haría.sstream.clearsolo 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.strlo 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 longsinostd::intptr_t.intptr_tpuede 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