如何使用A-F(而不是a-f)流式传输十六进制数字?

11

是否可以让 ostream 输出十六进制数时使用字符 A-F 而不是 a-f

int x = 0xABC;
std::cout << std::hex << x << std::endl;

这会输出abc,但我希望看到的是ABC


2
能否请给这个问题点踩的人,友好地解释一下这个问题有什么不妥之处呢?事实上,我已经在 MSDN 上搜索了“十六进制”,但是没有找到答案。那么这个问题有什么问题吗? - Armen Tsirunyan
不知道,但是这里有一个点赞来抵消它。我喜欢这样做,因为这是公平的(特别是对那些有真正问题的人- SO是为所有开发者级别而设计的,而不仅仅是像我这样的自以为是的知道一切的人),但更多的是因为它会让那些连留下评论都懒得做的路过踩的人感到恼火,这样问题就无法得到改进。当然,他们可能会出于报复而踩我的答案,但这并不意味着我缺少声望 :-) - paxdiablo
@paxdiablo: 我对报复性的负评感到不屑,因为那些可能会卷入这种无聊行为中的人的声望肯定不及我一半,所以我在这场比赛中必胜无疑。既然我声望比你低一半,那么你可以挺过去两倍的... - Steve Jessop
2个回答

12

可以使用 std::uppercase,它会影响浮点数和十六进制整数的输出:

std::cout << std::hex << std::uppercase << x << std::endl;

如下所示的完整程序:

#include <iostream>
#include <iomanip>

int main (void) {
    int x = 314159;
    std::cout << std::hex << x << " " << std::uppercase << x << std::endl;
    return 0;
}

这将输出:

4cb2f 4CB2F

1
这个修饰符只会影响十六进制数字,还是同样会影响字符串? - Jörgen Sigvardsson
2
十六进制数和科学计数法中的指数。如果您想要处理字符串,请参见 https://dev59.com/w3RB5IYBdhLWcg3wEDql - paxdiablo

1
在C++20中,您将能够使用{{link1:std::format}}来实现此目的:
std::cout << std::format("{:X}\n", 0xABC);  

输出:

ABC

与此同时,您可以使用基于 {fmt}库std::format。{fmt} 还提供了print函数,使这一过程更加简单高效(godbolt)。
fmt::print("{:X}\n", 0xABC); 

免责声明:我是{fmt}和C++20 std::format的作者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接