使用 0x 表示法打印地址
Posted
技术标签:
【中文标题】使用 0x 表示法打印地址【英文标题】:Printing addresses with 0x notation 【发布时间】:2021-03-25 14:58:11 【问题描述】:目前当我打印一个变量的地址时,
cout << &a
,它显示为一个简单的十六进制数字,比如:008FFBB8。
如何打印带有 0x 符号的地址?例如0x6FFDF4.
我试过了:
cout << hex << &a;
但它似乎不起作用。
【问题讨论】:
en.cppreference.com/w/cpp/io/manip/showbase 这能回答你的问题吗? Correct format specifier to print pointer or address? @RetiredNinja 我试过这样做,虽然它只适用于数字,但它似乎不适用于地址。 cout @ma1169 您提到的重复帖子是针对 C 语言,而不是 C++ 另外我想补充一点,虽然 0x 表示法不显示在 Visual Studio 中,但它默认显示在在线 cpp 编译器上。 【参考方案1】:有很多不同的解决方案,我想到的前两个如下:
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
int main()
std::cout << std::hex
<< "showbase: " << std::showbase<< 42 << '\n'
<< "noshowbase: " << std::noshowbase << 42 << '\n';
//2nd solution
std::string a"008FFBB8";
std::cout << "Given: " << a << '\n';
a.erase(0,2);
a = "0x"+a;
std::cout << "Edited: "<< a <<'\n';
//3rd string to int so you can use standard arithmetics
int b = std::stoul(a, nullptr, 16);
std::cout << "Represented as int: " << b << '\n';
std::cin.get();
编辑:
这是使用 GNU GCC(g++) 编译器编译后的打印方式。
Visual Studio 没有按屏幕截图所示打印它的原因是 Visual Studio 倾向于不使用 GNU GCC,而是使用其 Microsoft 编译器 MSVC。(There are other things MSVC isn't doing as you may expect btw.) 但好消息:you can make it! 或 here:)
这就是在您的配置中使用“MSVC”呈现十六进制的方式 我希望能回答你的问题,否则发表评论:)
【讨论】:
感谢您的回答。第一个解决方案实际上确实适用于数字,但它不影响地址。它像以前一样显示。即使添加了十六进制函数。至于第二种解决方案,我只是想知道为什么Visual Studio默认不显示这个符号,所以我不必手动这样做。 @Hexed 我添加了我的答案:) @Hexed 太棒了,不客气 :) 请不要忘记将一个答案标记为“已接受”,以便将您的问题从 *** 队列中清除。【参考方案2】:一个简单的方法
cout << "0x" << &a;
也就是说,鉴于其他系统确实在 &a
中包含 0x,为了使其可移植,您应该根据预定义的宏将 cout << "0x"
设为条件,以检测不包含 0x 的系统。
一种可移植的解决方案是先插入字符串流,然后检查是否添加了前缀,如果没有,则连接。这也防止了 0x 和地址被并发输出分隔的可能性。
我只是想知道为什么 Visual Studio 默认不显示这个符号,
因为他们的标准库的作者选择这样做。
所以我不必手动操作。
我不确定是否有办法改变它们的实现。在问怎么做之前,我建议你考虑一下为什么你认为你必须这样做。
【讨论】:
谢谢,但除非你想让编译器对你大喊大叫,否则我建议在 0x 周围添加双引号:P @Hexed 哎呀:)【参考方案3】:从MSDN 中汲取灵感 ;) 并在 VS 2019 上尝试:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
ios state(nullptr);
int a;
state.copyfmt(cout); // save current formatting
cout << "In hex: 0x" // now load up a bunch of formatting modifiers
<< hex
<< uppercase
<< setw(8)
<< setfill('0')
<< &a // the actual value we wanted to print out
<< endl;
cout.copyfmt(state); // restore previous formatting
输出:
In hex: 0x00AFFB44
至于为什么,嗯...如果您有数据,您可以在 MSVC 上提出问题并声称与所有其他编译器和平台相同。但考虑到他们自己手动输入了0x
,我猜他们已经对这种行为感到满意了。
【讨论】:
以上是关于使用 0x 表示法打印地址的主要内容,如果未能解决你的问题,请参考以下文章