C++ cout hex values?

I want to do:

int a = 255; cout << a; 

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

10 Answers

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.

3

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>.

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; 
2

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; 

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.

4

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.

There are different kinds of flags & masks you can use as well. Please refer 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; } 
1

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

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 with:

git clone 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.

3

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) << " "; } 

You Might Also Like