C + + cout 十六进制值?

我想做的是:

int a = 255;
cout << a;

让它在输出中显示 FF,我该怎么做?

332378 次浏览

用途:

#include <iostream>


...


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

许多其他选项来控制输出数字的确切格式,例如前导零和大小写。

std::hex<ios>中定义,<iostream>包含 <ios>。但是要使用像 std::setprecision/std::setw/std::setfill/etc 这样的东西,你必须包括 <iomanip>

要操作以十六进制打印的流,请使用 hex操作器:

cout << hex << a;

默认情况下,十六进制字符输出为小写。要将其更改为大写,请使用 uppercase操作程序:

cout << hex << uppercase << a;

要稍后将输出更改为小写,请使用 nouppercase操作器:

cout << nouppercase << b;

我知道这不是 OP 所要求的,但是我仍然认为指出如何使用 printf 来实现它是值得的。我几乎总是更喜欢使用它而不是 std: : cout (即使没有以前的 C 背景)。

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

“2”定义精度,“ X”或“ x”定义大小写。

有不同种类的旗帜和口罩,你也可以使用。请参考 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;
}

如果您想打印一个十六进制数,然后恢复为十进制,您可以使用以下命令:

std::cout << std::hex << num << std::dec << std::endl;

std::hex为您提供十六进制格式,但它是一个有状态选项,这意味着您需要保存和恢复状态,否则将影响所有未来的输出。

天真地切换回 std::dec只有在标志出现在之前的位置时才是好的,这种情况可能不会发生,特别是如果您正在编写库的话。

#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

这结合了格雷格 · 休吉尔的答案和来自 另一个问题的信息。

使用 std::uppercasestd::hex格式化要以十六进制格式显示的整数变量 a

#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

在我看来,这是目前最干净的方法,因为它不会用 std::hex污染 std::cout状态:

Main.cpp

#include <format>
#include <string>


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

预期产出:

10 0x11 18

尚未在 GCC 10.0.1,Ubuntu 20.04上实现。

但是这个令人敬畏的库后来变成了 C + + 20,并且在安装到 Ubuntu 22.04之后也应该是一样的:

sudo apt install libfmt-dev

或:

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

编译并运行:

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

记录在:

更多信息: 字符串格式,如 sprintf

Pre-C + + 20: 干净地打印并将 std::cout恢复到以前的状态

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

编译并运行:

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

产出:

10
17

更多细节: 在操作之后恢复 std: : cout 的状态

在 GCC 10.0.1,Ubuntu 20.04上测试。

你好吗!

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