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.