C ++ cout valores hexadecimales?


144

Quiero hacer:

int a = 255; 
cout << a;

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

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.


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>.


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;

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;

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.


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;
}

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 .


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;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.