C++ cout hex values?
Asked Answered
B

11

201

I want to do:

int a = 255; 
cout << a;

and have it show FF in the output, how would I do this?

Brownout answered 26/1, 2009 at 10:37 Comment(0)
Y
270

Use:

#include <iostream>

...

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

There are many other options to control the exact formatting of the output number, such as leading zeros and upper/lower case.

Yuonneyup answered 26/1, 2009 at 10:39 Comment(3)
This seems to change all future output from cout to hex; so if you only want 'a' to be printed in hex you may want something like cout << hex << a << dec; to change it back.Synapsis
@Synapsis One problem with restoring dec over hex is that dec may not have been the value previously set, especially if you're writing a generic library method. This question has some answers about how to store and restore state. You can save state with ios::fmtflags f(cout.flags()); and restore it with out.flags(f);.Stanhope
Then restore by std::cout.flags(f);Bagman
R
50

To manipulate the stream to print in hexadecimal use the hex manipulator:

cout << hex << a;

By default the hexadecimal characters are output in lowercase. To change it to uppercase use the uppercase manipulator:

cout << hex << uppercase << a;

To later change the output back to lowercase, use the nouppercase manipulator:

cout << nouppercase << b;
Reprobative answered 5/3, 2009 at 7:36 Comment(2)
Is nouppercase going to change the output back to decimal?Seely
Just to add miscellaneous note, the above snippet won't make an input "apple" becoming "APPLE".Bagman
M
48

std::hex is defined in <ios> which is included by <iostream>. But to use things like std::setprecision/std::setw/std::setfill/etc you have to include <iomanip>.

Might answered 26/1, 2009 at 10:52 Comment(0)
S
34

If you want to print a single hex number, and then revert back to decimal you can use this:

std::cout << std::hex << num << std::dec << std::endl;
Senn answered 17/1, 2015 at 20:1 Comment(0)
S
27

I understand this isn't what OP asked for, but I still think it is worth to point out how to do it with printf. I almost always prefer using it over std::cout (even with no previous C background).

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

'2' defines the precision, 'X' or 'x' defines case.

Sarthe answered 5/3, 2009 at 7:40 Comment(4)
There's long been a printf vs cout battle. Of course, cout has the nice property that it derives from ostream and gets all the abstraction benefits. C has no concept of stream objects and thus printf and fprintf are 2 different commands. Really, it would have been nice in C if stdout were a FILE*. Would have made things easier.Tripersonal
@Tripersonal stdout is a FILE * in C.Imprecation
Which is why printf("hello\n") is equivalent to fprintf(stdout, "hello\n"). More usefully, you can pass stdout (or stdin, or stderr) to a function that takes a FILE* argument.Montcalm
for anyone thinking that cout is a bliss - read the answers here. upper case? back to dec? flags? masks? you get hundred unresolved questions to only printing a number.. and std::format is still not implemented (2022!).. while printf gives you one definitive answer and is fast!Solitaire
S
20

std::hex gets you the hex formatting, but it is a stateful option, meaning you need to save and restore state or it will impact all future output.

Naively switching back to std::dec is only good if that's where the flags were before, which may not be the case, particularly if you're writing a library.

#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

This combines Greg Hewgill's answer and info from another question.

Stanhope answered 1/2, 2019 at 18:44 Comment(0)
S
15

C++20 std::format

This is now the cleanest method in my opinion, as it does not pollute std::cout state with std::hex:

main.cpp

#include <format>
#include <string>

int main() {
    std::cout << std::format("{:x} {:#x} {}\n", 16, 17, 18);
}

Expected output:

10 0x11 18

Not yet implemented on GCC 10.0.1, Ubuntu 20.04.

But the awesome library that became C++20 and should be the same worked once installed on Ubuntu 22.04 with:

sudo apt install libfmt-dev

or:

git clone https://github.com/fmtlib/fmt
cd fmt
git checkout 061e364b25b5e5ca7cf50dd25282892922375ddc
mkdir build
cmake ..
sudo make install

main2.cpp

#include <fmt/core.h>
#include <iostream>

int main() {
    std::cout << fmt::format("{:x} {:#x} {}\n", 16, 17, 18);
}

Compile and run:

g++ -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o main2.out main2.cpp -lfmt
./main2.out

Documented at:

More info at: std::string formatting like sprintf

Pre-C++20: cleanly print and restore std::cout to previous state

main.cpp

#include <iostream>
#include <string>

int main() {
    std::ios oldState(nullptr);
    oldState.copyfmt(std::cout);
    std::cout << std::hex;
    std::cout << 16 << std::endl;
    std::cout.copyfmt(oldState);
    std::cout << 17 << std::endl;
}

Compile and run:

g++ -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o main.out main.cpp
./main.out

Output:

10
17

More details: Restore the state of std::cout after manipulating it

Tested on GCC 10.0.1, Ubuntu 20.04.

Scapolite answered 24/9, 2020 at 14:2 Comment(4)
If anyone is wondering, you can check the status of standard library support at en.cppreference.com/w/cpp/compiler_support. This feature shows up as "Text formatting".Loyce
@TylerKropp nice table, I wasn't too aware of it!Scapolite
std::format wouldn't work on latest gcc / clang - godbolt.org/z/33nP7G3qTGarrek
It's a shame that it's been almost 2 years and gcc still does not support std::format. It's very useful.Ethos
C
13

There are different kinds of flags & masks you can use as well. Please refer http://www.cplusplus.com/reference/iostream/ios_base/setf/ for more information.

#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;
}
Cat answered 22/4, 2012 at 16:35 Comment(2)
I think the behavior of this code is undefined. The setf clears the ios::basefield bits, including ios::dec (default for standard streams), and sets only ios::hex. When ios::hex is unset, every bit in ios::basefield is unset. How it num printed the second time? evidence that the bits are all unset: ideone.com/fYXyh6. This is permitted for ios::floatfield according to Thinking in C++ vol 2 page 189, but it doesn't say the same about ios::basefield.Javanese
The code assumes that ios::hex was not set when calling itMarginate
C
9

Use std::uppercase and std::hex to format integer variable a to be displayed in hexadecimal format.

#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;
}
Contraposition answered 6/4, 2020 at 13:18 Comment(0)
B
9

How are you!

#include <iostream>
#include <iomanip>

unsigned char arr[] = {4, 85, 250, 206};
for (const auto & elem : arr) {
    std::cout << std::setfill('0') 
              << std::setw(2) 
              << std::uppercase 
              << std::hex 
              << (0xFF & elem) 
              << " ";
}
Bagman answered 22/12, 2020 at 14:10 Comment(0)
M
4

In C++23 you can use std::print to do this:

int a = 255; 
std::print("{:X}", a);

This method is faster, less verbose than using I/O manipulators and doesn't affect the global formatting state. You can also print to cout although this will loose some of the perf benefits.

Until std::print is widely available you can use the {fmt} library, it is based on (godbolt):

fmt::print("{:X}", a);

Disclaimer: I am the author of {fmt} and C++23 std::print.

Millihenry answered 17/12, 2023 at 16:17 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.