C ++ wartości szesnastkowe cout?

144

Chcę zrobić:

int a = 255; 
cout << a;

i pokaże FF na wyjściu, jak bym to zrobił?

Cœur
źródło

Odpowiedzi:

201

Posługiwać się:

#include <iostream>

...

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

Istnieje wiele innych opcji kontrolowania dokładnego formatowania numeru wyjściowego , na przykład zera wiodące i wielkie / małe litery.

Greg Hewgill
źródło
34
Wydaje się, że zmienia to wszystkie przyszłe dane wyjściowe z cout na hex; więc jeśli chcesz, aby „a” było drukowane w formacie szesnastkowym, możesz chcieć coś takiego jak cout << hex << a << dec;zmienić to z powrotem.
ShreevatsaR
16
@ShreevatsaR Jednym z problemów z przywracaniem dec przez hex jest to, że dec może nie być wcześniej ustawioną wartością, szczególnie jeśli piszesz ogólną metodę biblioteki. To pytanie zawiera odpowiedzi dotyczące przechowywania i przywracania stanu. Możesz zapisać stan za pomocą ios::fmtflags f(cout.flags());i przywrócić go za pomocą out.flags(f);.
jtpereyda
Następnie przywróć dostd::cout.flags(f);
trueadjustr
43

std::hexjest zdefiniowany, w <ios>którym jest uwzględniony przez <iostream>. Ale aby używać rzeczy takich jak std::setprecision/std::setw/std::setfill/ etc, musisz dołączyć <iomanip>.

Benoît
źródło
42

Aby manipulować strumieniem w celu wydrukowania w formacie szesnastkowym, użyj hexmanipulatora:

cout << hex << a;

Domyślnie znaki szesnastkowe są zapisywane małymi literami. Aby zmienić to na wielkie litery, użyj uppercasemanipulatora:

cout << hex << uppercase << a;

Aby później zmienić wyjście z powrotem na małe litery, użyj nouppercasemanipulatora:

cout << nouppercase << b;
Ashwin Nanjappa
źródło
2
Czy nouppercasezmieni wyjście z powrotem na dziesiętne?
Cœur
Aby dodać inną notatkę, powyższy fragment kodu nie sprawi, że dane wejściowe „jabłko” zmieni się w „APPLE”.
trueadjustr
20

Jeśli chcesz wydrukować pojedynczą liczbę szesnastkową, a następnie powrócić do dziesiętnej, możesz użyć tego:

std::cout << std::hex << num << std::dec << std::endl;
Yoav
źródło
13

Rozumiem, że nie o to prosił OP, ale nadal uważam, że warto wskazać, jak to zrobić z printf. Prawie zawsze wolę używać go zamiast std :: cout (nawet bez poprzedniego tła C).

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

„2” określa dokładność, „X” lub „x” określa wielkość liter.

Daniel Sloof
źródło
4
Od dawna trwa bitwa printf vs cout. Oczywiście cout ma tę fajną właściwość, że wywodzi się z ostreama i ma wszystkie zalety abstrakcji. C nie ma pojęcia obiektów strumieniowych, a zatem printf i fprintf to 2 różne polecenia. Naprawdę byłoby miło w C, gdyby stdout było PLIKEM *. Ułatwiłoby to sprawę.
rlbond
11
@rlbond stdout to PLIK * w C.
Étienne
4
Dlatego printf("hello\n")jest równoważne fprintf(stdout, "hello\n"). Bardziej użytecznie możesz przekazać stdout(lub stdin, lub stderr) do funkcji, która przyjmuje FILE*argument.
Keith Thompson,
11

Istnieją również różne rodzaje flag i masek, których możesz użyć. Więcej informacji można znaleźć pod adresem 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;
}
Gaurav
źródło
5
Myślę, że zachowanie tego kodu jest nieokreślone. Setf czyści bity ios :: basefield, w tym ios :: dec (domyślnie dla standardowych strumieni) i ustawia tylko ios :: hex. Gdy ios :: hex jest nieustawione, każdy bit w ios :: basefield jest nieustawiony. Jak to num wydrukowano po raz drugi? dowód, że wszystkie bity są nieustawione: ideone.com/fYXyh6 . Jest to dozwolone dla ios :: floatfield zgodnie z Thinking in C ++ vol 2 strona 189, ale nie mówi tego samego o ios :: basefield.
Joel Sjögren
10

std::hex wyświetla formatowanie szesnastkowe, ale jest to opcja stanowa, co oznacza, że ​​musisz zapisać i przywrócić stan, w przeciwnym razie wpłynie to na wszystkie przyszłe wyniki.

Naiwne przełączanie się z powrotem na std::decjest dobre tylko wtedy, gdy tam były wcześniej flagi, co może nie mieć miejsca, szczególnie jeśli piszesz bibliotekę.

#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

To łączy odpowiedź Grega Hewgilla i informacje z innego pytania .

jtpereyda
źródło
2

Użyj std::uppercasei, std::hexaby sformatować zmienną całkowitą, aktóra ma być wyświetlana w formacie szesnastkowym.

#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
źródło