C ++ cout十六进制值?


144

我想要做:

int a = 255; 
cout << a;

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

Answers:


201

用:

#include <iostream>

...

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

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


34
这似乎将所有将来的输出从cout更改为hex;因此,如果您只想以十六进制形式打印“ a”,则可能需要cout << hex << a << dec;将其改回原样。
ShreevatsaR 2012年

16
@ShreevatsaR用十六进制还原dec的一个问题是dec可能不是先前设置的值,尤其是在编写通用库方法时。这个问题对如何存储和还原状态有一些答案。您可以使用保存状态,ios::fmtflags f(cout.flags());并使用恢复状态out.flags(f);
jtpereyda 2015年

然后还原std::cout.flags(f);
Trudadjustr

43

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


42

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

cout << hex << a;

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

cout << hex << uppercase << a;

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

cout << nouppercase << b;

2
nouppercase要改变输出回十进制?
心教堂

仅添加其他注释,以上代码片段不会使输入的“ apple”变成“ APPLE”。
truthadjustr

20

如果要打印一个十六进制数字,然后还原为十进制,则可以使用以下命令:

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

13

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

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

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


4
长期以来,printf vs cout之战一直存在。当然,cout具有从ostream派生的漂亮属性,并获得了所有抽象的好处。C没有流对象的概念,因此printf和fprintf是2个不同的命令。真的,如果stdout是FILE *,在C语言中会很好。本来会使事情变得容易的。
rlbond

11
@rlbond stdout是C中的文件*。–
Étienne

4
这就是为什么printf("hello\n")等价于fprintf(stdout, "hello\n")。更有用的是,您可以将stdout(或stdinstderr)传递给带有FILE*参数的函数。
基思·汤普森

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

5
我认为此代码的行为是不确定的。setf清除ios :: basefield位,包括ios :: dec(标准流的默认值),并仅设置ios :: hex。当ios :: hex未设置时,ios :: basefield中的每个位都未设置。第二次如何打印?证明所有位都未设置:ideone.com/fYXyh6。根据《 C ++中的思考》第2卷第189页,这对于ios :: floatfield是允许的,但是关于ios :: basefield的说法却不同。
JoelSjögren'13年

10

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的回答和其他问题的信息。


2

使用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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.