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

也就是说,鉴于其他系统确实在 &amp;a 中包含 0x,为了使其可移植,您应该根据预定义的宏将 cout &lt;&lt; "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 表示法打印地址的主要内容,如果未能解决你的问题,请参考以下文章

C指针1

Java打印整数的二进制表示(代码与解析)

ssd1306高地址起始为啥是0x10

scapy构造打印ARP数据包

信息的表示和处理

内存地址和内存空间