C ++ cout十六进制值?

时间:2009-01-26 10:37:48

标签: c++ hex cout

我想这样做:

int a = 255; 
cout << a;

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

10 个答案:

答案 0 :(得分:177)

使用:

#include <iostream>

...

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

many other options to control the exact formatting of the output number,例如前导零和大写/小写。

答案 1 :(得分:38)

std::hex<ios>中定义,<iostream>包含该std::setprecision/std::setw/std::setfill。但要使用<iomanip> / etc等内容,您必须包含{{1}}。

答案 2 :(得分:36)

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

cout << hex << a;

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

cout << hex << uppercase << a;

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

cout << nouppercase << b;

答案 3 :(得分:14)

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

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

答案 4 :(得分:8)

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

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

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

答案 5 :(得分:8)

有各种各样的旗帜和&amp;你也可以使用的面具。有关详细信息,请参阅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;
}

答案 6 :(得分:4)

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

答案 7 :(得分:3)

C ++ 20 std::format

我认为这是最干净的方法,因为它不会污染std::cout的{​​{1}}状态:

std::hex

预期输出:

#include <format>
#include <string>

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

尚未在GCC 10.0.1,Ubuntu 20.04上实现,因此我尚未对其进行测试。

记录在:

更多信息,请访问:std::string formatting like sprintf

C ++ 20之前的版本:干净地打印10 0x11 18 并将其还原到以前的状态

main.cpp

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

更多详细信息:Restore the state of std::cout after manipulating it

在GCC 10.0.1,Ubuntu 20.04上进行了测试。

答案 8 :(得分:2)

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的回答和来自another question的信息。

答案 9 :(得分:1)

你好吗!

#include <iostream>
#include <iomanip>

unsigned char buf0[] = {4, 85, 250, 206};
for (int i = 0;i < sizeof buf0 / sizeof buf0[0]; i++) {
    std::cout << std::setfill('0') 
              << std::setw(2) 
              << std::uppercase 
              << std::hex << (0xFF & buf0[i]) << " ";
}