我想要做:
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)
还有许多其他选项可以控制输出编号的确切格式,例如前导零和大写/小写.
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)
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)
Dan*_*oof 10
我知道这不是OP要求的,但我仍然认为值得指出如何用printf来做.我几乎总是喜欢在std :: cout上使用它(即使没有以前的C背景).
printf("%.2X", a);
Run Code Online (Sandbox Code Playgroud)
'2'定义精度,'X'或'x'定义大小写.
你好吗!
#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)
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::uppercase
和std::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)