C ++ valori esadecimali?


144

Voglio fare:

int a = 255; 
cout << a;

e devo mostrare FF nell'output, come lo farei?

Risposte:


201

Uso:

#include <iostream>

...

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

Esistono molte altre opzioni per controllare la formattazione esatta del numero di output , come zeri iniziali e maiuscoli / minuscoli.


34
Questo sembra cambiare tutto l'output futuro da cout a hex; quindi se vuoi solo che una "a" venga stampata in esadecimale, potresti voler cout << hex << a << dec;cambiare qualcosa come .
ShreevatsaR

16
@ShreevatsaR Un problema con il ripristino di dec su hex è che dec potrebbe non essere stato il valore precedentemente impostato, specialmente se stai scrivendo un metodo di libreria generico. Questa domanda ha alcune risposte su come memorizzare e ripristinare lo stato. È possibile salvare lo stato con ios::fmtflags f(cout.flags());e ripristinarlo con out.flags(f);.
jtpereyda,

Quindi ripristinare entrostd::cout.flags(f);
truthadjustr il

43

std::hexè definito in <ios>cui è incluso da <iostream>. Ma per usare cose come std::setprecision/std::setw/std::setfill/ etc devi includere <iomanip>.


42

Per manipolare il flusso per stamparlo in formato esadecimale, utilizzare il hexmanipolatore:

cout << hex << a;

Per impostazione predefinita, i caratteri esadecimali vengono emessi in minuscolo. Per cambiarlo in maiuscolo usa il uppercasemanipolatore:

cout << hex << uppercase << a;

Per modificare in seguito l'output in minuscolo, utilizzare il nouppercasemanipolatore:

cout << nouppercase << b;

2
Il nouppercaserisultato tornerà in decimale?
Cor

Solo per aggiungere una nota varia, lo snippet sopra non farà in modo che un input "apple" diventi "APPLE".
truthadjustr,

20

Se si desidera stampare un singolo numero esadecimale, quindi tornare al decimale, è possibile utilizzare questo:

std::cout << std::hex << num << std::dec << std::endl;

13

Capisco che questo non è ciò che OP ha richiesto, ma penso comunque che valga la pena sottolineare come farlo con printf. Preferisco quasi sempre usarlo su std :: cout (anche senza uno sfondo C precedente).

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

'2' definisce la precisione, 'X' o 'x' definisce il caso.


4
C'è stata a lungo una battaglia tra printf e cout. Naturalmente, Cout ha la bella proprietà che deriva da ostream e ottiene tutti i benefici dell'astrazione. C non ha il concetto di oggetti stream e quindi printf e fprintf sono 2 comandi diversi. Davvero, sarebbe stato carino in C se stdout fosse un FILE *. Avrebbe reso le cose più facili.
rlbond,

11
@rlbond stdout è un FILE * in C.
Étienne l'

4
Ecco perché printf("hello\n")equivale a fprintf(stdout, "hello\n"). Più utilmente, puoi passare stdout(o stdin, o stderr) a una funzione che accetta un FILE*argomento.
Keith Thompson,

11

Esistono diversi tipi di bandiere e maschere che puoi usare. Per ulteriori informazioni, consultare http://www.cplusplus.com/reference/iostream/ios_base/setf/

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

5
Penso che il comportamento di questo codice non sia definito. Setf cancella i bit ios :: basefield, incluso ios :: dec (predefinito per i flussi standard) e imposta solo ios :: hex. Quando ios :: hex non è impostato, ogni bit in ios :: basefield non è impostato. Come si è intorpidito la seconda volta? prova che i bit sono tutti disinseriti: ideone.com/fYXyh6 . Questo è permesso per ios :: floatfield secondo Thinking in C ++ vol 2 page 189, ma non dice lo stesso di ios :: basefield.
Joel Sjögren,

10

std::hex ti dà la formattazione esadecimale, ma è un'opzione stateful, il che significa che devi salvare e ripristinare lo stato o avrà un impatto su tutto l'output futuro.

Tornare in modo ingenuo al ritorno std::decè positivo solo se prima c'erano le bandiere, il che potrebbe non essere il caso, in particolare se si sta scrivendo una libreria.

#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

Questo combina la risposta e le informazioni di Greg Hewgill da un'altra domanda .


2

Utilizzare std::uppercasee std::hexper formattare la variabile intera ada visualizzare in formato esadecimale.

#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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.