C ++ cout valores hexadecimales?

144

Quiero hacer:

int a = 255; 
cout << a;

y que muestre FF en la salida, ¿cómo haría esto?

Coeur
fuente

Respuestas:

201

Utilizar:

#include <iostream>

...

std::cout << std::hex << a;

Existen muchas otras opciones para controlar el formato exacto del número de salida , como los ceros iniciales y las mayúsculas / minúsculas.

Greg Hewgill
fuente
34
Esto parece cambiar todos los resultados futuros de cout a hexadecimal; así que si solo desea que se imprima 'a' en hexadecimal, es posible que desee algo así como cout << hex << a << dec;cambiarlo nuevamente.
ShreevatsaR
16
@ShreevatsaR Un problema con la restauración de dec sobre hex es que dec puede no haber sido el valor establecido previamente, especialmente si está escribiendo un método genérico de biblioteca. 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
Luego restaurar porstd::cout.flags(f);
truthadjustr
43

std::hexse define en el <ios>que está incluido por <iostream>. Pero para usar cosas como std::setprecision/std::setw/std::setfill/ etc. tienes que incluir <iomanip>.

Benoît
fuente
42

Para manipular la secuencia para imprimir en hexadecimal, use el hexmanipulador:

cout << hex << a;

Por defecto, los caracteres hexadecimales se muestran en minúsculas. Para cambiarlo a mayúsculas, use el uppercasemanipulador:

cout << hex << uppercase << a;

Para luego cambiar la salida a minúsculas, use el nouppercasemanipulador:

cout << nouppercase << b;
Ashwin Nanjappa
fuente
2
¿ nouppercaseVa a cambiar la salida a decimal?
Coeur
Solo para agregar notas misceláneas, el fragmento anterior no hará que una entrada "manzana" se convierta en "MANZANA".
truthadjustr
20

Si desea imprimir un solo número hexadecimal y luego volver al decimal, puede usar esto:

std::cout << std::hex << num << std::dec << std::endl;
Yoav
fuente
13

Entiendo que esto no es lo que OP solicitó, pero sigo pensando que vale la pena señalar cómo hacerlo con printf. Casi siempre prefiero usarlo sobre std :: cout (incluso sin un fondo C anterior).

printf("%.2X", a);

'2' define la precisión, 'X' o 'x' define el caso.

Daniel Sloof
fuente
44
Durante mucho tiempo ha habido una batalla printf vs cout. Por supuesto, cout tiene la buena propiedad que deriva de ostream y obtiene todos los beneficios de abstracción. C no tiene ningún concepto de objetos de flujo y, por lo tanto, printf y fprintf son 2 comandos diferentes. Realmente, hubiera sido bueno en C si stdout fuera un FILE *. Hubiera facilitado las cosas.
rlbond
11
@rlbond stdout es un ARCHIVO * en C.
Étienne
44
Por eso printf("hello\n")es equivalente a fprintf(stdout, "hello\n"). Más útilmente, puede pasar stdout(o stdin, o stderr) a una función que toma un FILE*argumento.
Keith Thompson
11

También puedes usar diferentes tipos de banderas y máscaras. Consulte http://www.cplusplus.com/reference/iostream/ios_base/setf/ para obtener 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;
}
Gaurav
fuente
55
Creo que el comportamiento de este código no está definido. Setf borra los bits ios :: basefield, incluidos 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 imprime el número la segunda vez? Evidencia de que los bits no están configurados: ideone.com/fYXyh6 . Esto está permitido para ios :: floatfield de acuerdo con Thinking in C ++ vol 2 page 189, pero no dice lo mismo sobre ios :: basefield.
Joel Sjögren
10

std::hex le da el formato hexadecimal, pero es una opción con estado, lo que significa que necesita guardar y restaurar el estado o afectará a todos los resultados futuros.

Cambiar ingenuamente a std::decsolo es bueno si es donde estaban las banderas antes, 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 e información de Greg Hewgill de otra pregunta .

jtpereyda
fuente
2

Utilice std::uppercasey std::hexpara formatear la variable entera aque se mostrará en formato hexadecimal.

#include <iostream>
int main() {
   int a = 255;

   // Formatting Integer
   std::cout << std::uppercase << std::hex << a << std::endl; // Output: FF
   std::cout << std::showbase  << std::hex << a << std::endl; // Output: 0XFF
   std::cout << std::nouppercase << std::showbase  << std::hex << a << std::endl; // Output: 0xff

   return 0;
}
va6un
fuente