2009-01-26 17 views

Respuesta

145

Uso:

#include <iostream> 

... 

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

Hay many other options to control the exact formatting of the output number, tales como los ceros y mayúsculas/minúsculas.

+21

Esto parece cambiar toda la producción futura de cout a hexagonal; así que si solo quiere que 'a' se imprima en hexadecimal, puede querer algo como 'cout << hex << a << dec;' para volver a cambiarlo. – ShreevatsaR

+7

@ShreevatsaR Un problema con la restauración de la dism sobre el hexadecimal es que la dism puede no haber sido el valor establecido previamente, especialmente si está escribiendo un método de biblioteca genérico. [Esta pregunta] (http://stackoverflow.com/q/2273330/461834) tiene algunas respuestas sobre cómo almacenar y restablecer el estado. Puede guardar el estado con 'ios :: fmtflags f (cout.flags());' y restaurarlo con 'out.flags (f);'. – jtpereyda

33

std::hex se define en <ios> que está incluido en <iostream>. Pero para usar cosas como std::setprecision/std::setw/std::setfill/etc, debe incluir <iomanip>.

31

para manipular el flujo de imprimir en hexadecimal utilizar el manipulador hex:

cout << hex << a; 

Por defecto los caracteres hexadecimales se emiten en minúsculas. Para cambiar a mayúscula uso del manipulador uppercase:

cout << hex << uppercase << a; 

a cambiar después de la salida de nuevo a minúsculas, utilice el manipulador nouppercase:

cout << nouppercase << b; 
7

entiendo que esto no es lo que pidió OP para, pero Sigo pensando que vale la pena señalar cómo hacerlo con printf. Casi siempre prefiero usarlo en std :: cout (incluso sin antecedentes C previos).

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

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

+2

Ha habido una larga batalla printf vs cout. Por supuesto, cout tiene la buena propiedad que deriva de ostream y obtiene todos los beneficios de la abstracción. C no tiene ningún concepto de objetos de transmisión y, por lo tanto, printf y fprintf son 2 comandos diferentes. Realmente, hubiera sido bueno en C si stdout fuera un ARCHIVO *. Hubiera hecho las cosas más fáciles. – rlbond

+8

@rlbond stdout es un ARCHIVO * en C. –

+2

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 argumento' FILE * '. –

7

Hay diferentes tipos de banderas & máscaras que puede usar también. 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; 
} 
+3

Creo que el comportamiento de este código no está definido. El setf borra los bits de ios :: basefield, incluyendo ios :: dec (predeterminado para streams estándar), y solo establece ios :: hex. Cuando ios :: hex está desarmado, cada bit en ios :: basefield está desarmado. ¿Cómo se imprimió num la segunda vez?evidencia de que todos los bits están desarmados: http://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. –

10

Si desea imprimir un único número hexadecimal y, a continuación, volver a decimal se puede utilizar este: std::cout << std::hex << num << std::dec << std::endl;

Cuestiones relacionadas