C ++ cout hex Werte?

144

Ich will das tun:

int a = 255; 
cout << a;

und muss es FF in der Ausgabe anzeigen, wie würde ich das tun?

Cœur
quelle

Antworten:

201

Verwenden:

#include <iostream>

...

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

Es gibt viele andere Optionen, um die genaue Formatierung der Ausgabenummer zu steuern , z. B. führende Nullen und Groß- / Kleinschreibung.

Greg Hewgill
quelle
34
Dies scheint alle zukünftigen Ausgaben von cout auf hex zu ändern. Wenn Sie also nur möchten, dass 'a' in hexadezimaler Form gedruckt wird, möchten Sie möglicherweise etwas cout << hex << a << dec;ändern.
ShreevatsaR
16
@ShreevatsaR Ein Problem beim Wiederherstellen von dec über hex ist, dass dec möglicherweise nicht der zuvor festgelegte Wert war, insbesondere wenn Sie eine generische Bibliotheksmethode schreiben. Diese Frage enthält einige Antworten zum Speichern und Wiederherstellen des Status. Sie können den Status mit speichern ios::fmtflags f(cout.flags());und mit wiederherstellen out.flags(f);.
jtpereyda
Dann wiederherstellen bisstd::cout.flags(f);
Truthadjustr
43

std::hexist definiert in <ios>dem enthalten ist durch <iostream>. Aber um Dinge wie std::setprecision/std::setw/std::setfill/ etc zu benutzen , muss man einschließen <iomanip>.

Benoît
quelle
42

Verwenden Sie den hexManipulator, um den Stream so zu bearbeiten, dass er hexadezimal gedruckt wird :

cout << hex << a;

Standardmäßig werden die Hexadezimalzeichen in Kleinbuchstaben ausgegeben. Um es in Großbuchstaben zu ändern, verwenden Sie den uppercaseManipulator:

cout << hex << uppercase << a;

Verwenden Sie den nouppercaseManipulator, um die Ausgabe später wieder in Kleinbuchstaben umzuwandeln:

cout << nouppercase << b;
Ashwin Nanjappa
quelle
2
Wird nouppercasedie Ausgabe wieder auf dezimal geändert?
Cœur
Nur um verschiedene Anmerkungen hinzuzufügen, wird das obige Snippet nicht dazu führen, dass eine Eingabe "Apfel" zu "APFEL" wird.
Truthadjustr
20

Wenn Sie eine einzelne Hex-Zahl drucken und dann wieder auf die Dezimalzahl zurücksetzen möchten, können Sie Folgendes verwenden:

std::cout << std::hex << num << std::dec << std::endl;
Yoav
quelle
12

Ich verstehe, dass OP nicht darum gebeten hat, aber ich denke immer noch, dass es sich lohnt, darauf hinzuweisen, wie man es mit printf macht. Ich bevorzuge es fast immer gegenüber std :: cout (auch ohne vorherigen C-Hintergrund).

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

'2' definiert die Genauigkeit, 'X' oder 'x' definiert den Fall.

Daniel Sloof
quelle
4
Es gibt schon lange einen Kampf zwischen Printf und Cout. Natürlich hat cout die nette Eigenschaft, dass es von ostream abgeleitet ist und alle Abstraktionsvorteile erhält. C hat kein Konzept für Stream-Objekte und daher sind printf und fprintf zwei verschiedene Befehle. Wirklich, es wäre schön in C gewesen, wenn stdout eine DATEI * wäre. Hätte es einfacher gemacht.
Rlbond
10
@rlbond stdout ist eine DATEI * in C.
Étienne
3
Welches ist, warum printf("hello\n")ist gleichbedeutend mit fprintf(stdout, "hello\n"). Nützlicherweise können Sie stdout(oder stdinoder stderr) an eine Funktion übergeben, die a übernimmtFILE* Argument akzeptiert.
Keith Thompson
11

Es gibt verschiedene Arten von Flaggen und Masken, die Sie ebenfalls verwenden können. Weitere Informationen finden Sie unter 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
quelle
5
Ich denke, das Verhalten dieses Codes ist undefiniert. Der setf löscht die ios :: basefield-Bits, einschließlich ios :: dec (Standard für Standard-Streams), und setzt nur ios :: hex. Wenn ios :: hex nicht gesetzt ist, ist jedes Bit in ios :: basefield nicht gesetzt. Wie wurde es das zweite Mal gedruckt? Beweis, dass die Bits alle nicht gesetzt sind: ideone.com/fYXyh6 . Dies ist für ios :: floatfield gemäß Thinking in C ++ Vol. 2, Seite 189 zulässig, sagt jedoch nicht dasselbe über ios :: basefield aus.
Joel Sjögren
10

std::hex Sie erhalten die Hex-Formatierung, dies ist jedoch eine statusbehaftete Option. Dies bedeutet, dass Sie den Status speichern und wiederherstellen müssen, da dies Auswirkungen auf alle zukünftigen Ausgaben hat.

Ein naives Zurückschalten std::decist nur dann gut, wenn sich dort zuvor die Flags befanden, was möglicherweise nicht der Fall ist, insbesondere wenn Sie eine Bibliothek schreiben.

#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

Dies kombiniert Greg Hewgills Antwort und Informationen aus einer anderen Frage .

jtpereyda
quelle
2

Verwenden std::uppercase und, std::hexum eine Ganzzahlvariable zu formatieren a, die im Hexadezimalformat angezeigt werden soll.

#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
quelle