174

我想要做:

int a = 255; 
cout << a;

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

4

10 回答 10

238

利用:

#include <iostream>

...

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

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

于 2009-01-26T10:39:42.187 回答
46

std::hex由 包含在<ios>其中定义<iostream>。但是要使用std::setprecision/std::setw/std::setfill/etc 之类的东西,您必须包含<iomanip>.

于 2009-01-26T10:52:58.337 回答
45

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

cout << hex << a;

默认情况下,十六进制字符以小写形式输出。要将其更改为大写,请使用uppercase操纵器:

cout << hex << uppercase << a;

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

cout << nouppercase << b;
于 2009-03-05T07:36:13.190 回答
29

如果你想打印一个十六进制数字,然后恢复为十进制,你可以使用这个:

std::cout << std::hex << num << std::dec << std::endl;
于 2015-01-17T20:01:54.993 回答
18

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

这结合了 Greg Hewgill 的回答和来自另一个问题的信息。

于 2019-02-01T18:44:15.003 回答
16

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

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

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

于 2009-03-05T07:40:11.370 回答
13

您也可以使用不同种类的标志和面具。请参阅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;
}
于 2012-04-22T16:35:05.480 回答
8

使用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;
}
于 2020-04-06T13:18:33.850 回答
6

C++20std::format

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

主文件

#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 的很棒的库,一旦安装后应该是一样的:

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

记录在:

更多信息:std::string 格式,如 sprintf

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

主文件

#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 上测试。

于 2020-09-24T14:02:11.880 回答
4

你好吗!

#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) 
              << " ";
}
于 2020-12-22T14:10:26.147 回答