C++ cout十六进制值?

137 c++ hex cout

我想要做:

int a = 255; 
cout << a;
Run Code Online (Sandbox Code Playgroud)

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

Gre*_*ill 190

使用:

#include <iostream>

...

std::cout << std::hex << a;
Run Code Online (Sandbox Code Playgroud)

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

  • 这似乎改变了从cout到hex的所有未来输出; 所以如果你只想用'hex'打印十六进制,你可能需要像`cout << hex << a << dec;`这样的东西来改变它. (28认同)
  • @ShreevatsaR将十六进制还原为十六进制的一个问题是dec可能不是先前设置的值,特别是如果您正在编写通用库方法.[这个问题](http://stackoverflow.com/q/2273330/461834)有一些关于如何存储和恢复状态的答案.你可以使用`ios :: fmtflags f(cout.flags());`来保存状态,并用`out.flags(f);`恢复它. (15认同)
  • @Cœur谢谢,发布在这里:/sf/answers/3813981531/ (2认同)

Ben*_*oît 42

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


Ash*_*ppa 40

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

cout << hex << a;
Run Code Online (Sandbox Code Playgroud)

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

cout << hex << uppercase << a;
Run Code Online (Sandbox Code Playgroud)

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

cout << nouppercase << b;
Run Code Online (Sandbox Code Playgroud)

  • 只是为了添加杂项注释,上面的代码片段不会使输入“apple”变成“APPLE”。 (3认同)
  • nouppercase是否会将输出更改回十进制? (2认同)

Ben*_*Uri 18

如果要打印单个十六进制数,然后恢复为十进制,可以使用:

std::cout << std::hex << num << std::dec << std::endl;
Run Code Online (Sandbox Code Playgroud)


Cir*_*四事件 14

C++20std::format

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

主程序

#include <format>
#include <string>

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

预期输出:

10 0x11 18
Run Code Online (Sandbox Code Playgroud)

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

但是这个很棒的库变成了 C++20,并且在 Ubuntu 22.04 上安装后应该是一样的:

sudo apt install libfmt-dev
Run Code Online (Sandbox Code Playgroud)

或者:

git clone https://github.com/fmtlib/fmt
cd fmt
git checkout 061e364b25b5e5ca7cf50dd25282892922375ddc
mkdir build
cmake ..
sudo make install
Run Code Online (Sandbox Code Playgroud)

main2.cpp

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

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

编译并运行:

g++ -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o main2.out main2.cpp -lfmt
./main2.out
Run Code Online (Sandbox Code Playgroud)

记录于:

更多信息请参见: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;
}
Run Code Online (Sandbox Code Playgroud)

编译并运行:

g++ -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o main.out main.cpp
./main.out
Run Code Online (Sandbox Code Playgroud)

输出:

10
17
Run Code Online (Sandbox Code Playgroud)

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

在 GCC 10.0.1、Ubuntu 20.04 上测试。


小智 11

您也可以使用不同种类的旗帜和面具.有关更多信息,请参阅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;
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为这段代码的行为是未定义的.setf清除ios :: basefield位,包括ios :: dec(标准流的默认值),并仅设置ios :: hex.当未设置ios :: hex时,ios :: basefield中的每个位都未设置.如何打印第二次?证据表明这些比特都未设置:http://ideone.com/fYXyh6.根据Thinking in C++ vol 2 page 189,这允许用于ios :: floatfield,但它对ios :: basefield没有相同的说法. (5认同)

Dan*_*oof 10

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

printf("%.2X", a);
Run Code Online (Sandbox Code Playgroud)

'2'定义精度,'X'或'x'定义大小写.

  • @rlbond stdout是C中的FILE* (10认同)
  • 长期以来一直是printf与cout之战.当然,cout具有很好的属性,它来自ostream并获得所有的抽象优势.C没有流对象的概念,因此printf和fprintf是2个不同的命令.真的,如果stdout是FILE*,它在C中会很好.会让事情变得更容易. (4认同)
  • 这就是为什么`printf("hello \n")`等同于`fprintf(stdout,"hello \n")`.更有用的是,你可以将`stdout`(或`stdin`或`stderr`)传递给一个带有'FILE*`参数的函数. (3认同)
  • 对于任何认为“cout”是一种幸福的人 - 请阅读此处的答案。大写?回到十二月?旗帜?面具?你会得到数百个未解决的问题,只打印一个数字..并且 std::format 仍未实现(2022!)..而 `printf` 给你一个明确的答案,而且速度很快! (2认同)

typ*_*gic 9

你好吗!

#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) 
              << " ";
}
Run Code Online (Sandbox Code Playgroud)


jtp*_*yda 7

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
Run Code Online (Sandbox Code Playgroud)

这结合了Greg Hewgill的回答和其他问题的信息。


小智 6

使用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;
}
Run Code Online (Sandbox Code Playgroud)