Quiero hacer:
int a = 255;
cout << a;
y hacer que muestre FF en la salida, ¿cómo haría esto?
Quiero hacer:
int a = 255;
cout << a;
y hacer que muestre FF en la salida, ¿cómo haría esto?
greg hewgill
Utilizar:
#include <iostream>
...
std::cout << std::hex << a;
Hay muchas otras opciones para controlar el formato exacto del número de salidacomo ceros a la izquierda y mayúsculas/minúsculas.
Esto parece cambiar toda la salida futura de cout a hexadecimal; entonces, si solo desea que ‘a’ se imprima en hexadecimal, es posible que desee algo como cout << hex << a << dec;
para volver a cambiarlo.
– ShreevatsaR
9 de marzo de 2012 a las 10:00
@ShreevatsaR Un problema con la restauración de dec sobre hexadecimal es que es posible que dec no haya sido el valor establecido previamente, especialmente si está escribiendo un método de biblioteca genérico. Esta pregunta tiene algunas respuestas sobre cómo almacenar y restaurar el estado. Puede guardar el estado con ios::fmtflags f(cout.flags());
y restaurarlo con out.flags(f);
.
– jtpereyda
8 de enero de 2015 a las 0:09
Luego restaurar por std::cout.flags(f);
– campo propio
14 de marzo de 2020 a las 9:30
Benoît
std::hex
se define en <ios>
que está incluido por <iostream>
. Pero usar cosas como std::setprecision/std::setw/std::setfill
/etc tienes que incluir <iomanip>
.
Para manipular la secuencia para imprimir en hexadecimal, use el hex
manipulador:
cout << hex << a;
De forma predeterminada, los caracteres hexadecimales se muestran en minúsculas. Para cambiarlo a mayúsculas utilice el uppercase
manipulador:
cout << hex << uppercase << a;
Para cambiar más tarde la salida a minúsculas, use el nouppercase
manipulador:
cout << nouppercase << b;
Es nouppercase
va a cambiar la salida de nuevo a decimal?
– Corazón
1 de febrero de 2019 a las 7:21
Solo para agregar una nota miscelánea, el fragmento anterior no hará que una entrada “manzana” se convierta en “MANZANA”.
– campo propio
14 de marzo de 2020 a las 9:44
Yoav
Si desea imprimir un solo número hexadecimal y luego volver a decimal, puede usar esto:
std::cout << std::hex << num << std::dec << std::endl;
jtpereyda
std::hex
obtiene el formato hexadecimal, pero es una opción con estado, lo que significa que debe guardar y restaurar el estado o afectará todos los resultados futuros.
Cambiando ingenuamente de nuevo a std::dec
solo es bueno si ahí es donde estaban antes las banderas, lo que puede no ser el caso, especialmente si está escribiendo una biblioteca.
#include <iostream>
#include <ios>
...
std::ios_base::fmtflags f( cout.flags() ); // save flags state
std::cout << std::hex << a;
cout.flags( f ); // restore flags state
Esto combina la respuesta de Greg Hewgill y la información de otra pregunta.
Entiendo que esto no es lo que pidió OP, pero sigo pensando que vale la pena señalar cómo hacerlo con printf. Casi siempre prefiero usarlo sobre std::cout (incluso sin experiencia previa en C).
printf("%.2X", a);
‘2’ define la precisión, ‘X’ o ‘x’ define el caso.
Gaurav
También hay diferentes tipos de banderas y máscaras que puedes usar. Consulte http://www.cplusplus.com/reference/iostream/ios_base/setf/ para más información.
#include <iostream>
using namespace std;
int main()
{
int num = 255;
cout.setf(ios::hex, ios::basefield);
cout << "Hex: " << num << endl;
cout.unsetf(ios::hex);
cout << "Original format: " << num << endl;
return 0;
}
Creo que el comportamiento de este código no está definido. El setf borra los bits de ios::basefield, incluido ios::dec (predeterminado para flujos estándar), y establece solo ios::hex. Cuando ios::hex está desarmado, cada bit en ios::basefield está desarmado. ¿Cómo se num imprimió la segunda vez? evidencia de que todos los bits están desarmados: ideone.com/fYXyh6. Esto está permitido para ios::floatfield según Thinking in C++ vol 2 página 189, pero no dice lo mismo sobre ios::basefield.
– Joel Sjogren
21 de julio de 2013 a las 15:14