【问题标题】:How to print addresses (Hex values) in upper case in c++如何在c ++中以大写形式打印地址(十六进制值)
【发布时间】:2015-03-01 15:11:28
【问题描述】:

我正在尝试以十六进制打印变量的地址(引用),并且也以大写形式打印。但我看到我能够以大写形式打印 77 的十六进制等价物,但不能打印变量的地址(引用)。有人可以帮帮我吗?

以下是我遇到困难的程序。

#include <iostream>
#include <string>

using namespace std;


void print_nb_of_items(const int nb_of_apple, const int& nb_of_pens)
{
    cout << "Number of apples = " << nb_of_apple << endl;
    cout << "Number of pens = " << nb_of_pens << " Address = " << uppercase << hex << &nb_of_pens << endl;
    cout << "Hex output in uppercase = " << uppercase << hex << 77 << endl;
}

/* The main function */

int main(int argc, char * argv[])
{
    int nb_apple = 24;
    int nb_pens = 65;
    print_nb_of_items(nb_apple, nb_pens);

    return 0;
}

我得到的程序的输出是:

Number of apples = 24
Number of pens = 65 Address = 0xbffbd438
Hex output in uppercase = 4D

我希望将地址打印为:0xBFFBD438。 我该怎么做?

【问题讨论】:

  • 对我来说很好。你用什么编译器?
  • 转换为uintptr_t?指针的输出只是“按照惯例”的十六进制,而不是标准定义的。如果你有一个用于 PDP-11 的 C++ 编译器,它可能会以八进制输出地址,因为这是该架构中指针的通用标准输出格式。
  • @ChristianHackl 不适合我:ideone.com/K1Dwy1
  • @πάνταῥεῖ:嗯,我从来没有真正接触过所有的流操纵器。一种快速的解决方法是将值读入字符串流并将生成的字符串转换为大写(始终牢记十六进制表示本身是特定于平台的)。
  • 您使用的“地址(参考)”术语是什么?引用和指针是不同的东西。

标签: c++


【解决方案1】:

您可以通过查看地址值的每个字符(使用 ord() 函数或类似函数)来检查地址值的每个字符,并且只修改特定范围内的 ASCII 值(字符范围,从 93 左右开始'a') 通过将值转换为相应大写字符的 ASCII 值并将它们转换回来(使用 char() 函数)。

我知道这是一种非常老套的方法。

编辑:这也会将第二个“x”转换为“X”

【讨论】:

  • “我知道这是一种非常老套的方法。” 是的。
【解决方案2】:

“我希望将地址打印为:0xBFFBD438。我该怎么做?”

好吧,@MatsPetterson 在他的comment 中一针见血,将地址值转换为uintptr_t

cout << "Number of pens = " << nb_of_pens 
     << " Address = 0x" << uppercase << hex 
     << uintptr_t(&nb_of_pens) << endl;
     // ^^^^^^^^^^           ^

让它正常工作(请参阅完整工作示例here)。


更深入地解释:

的实现
 std::ostream operator<<(ostream& os, void* ptr);

标准没有进一步规定,可能根本不受/考虑std::uppercase I/O 操纵器的影响。将指针值转换为纯数字,将使std::uppercasestd::hex I/O 操纵器生效。

【讨论】:

  • 为什么不reinterpret_cast
  • 我曾经有过this silly discussion。出于格式化目的,我更喜欢简短。
  • 更不用说 C 风格的转换不会被错误地写成 reinterpret_cats ... :)
  • @MatsPetersson:reinterpret_cast 不是唯一可以在这里工作的 C++ 风格的演员表吗?
  • @ChristianHackl 是的。但是,正如提到的可读性和目的,它看起来对我来说有点过分了。
【解决方案3】:

printf("%p", &amp;obj) 一样,指针的流输出格式完全未指定。按照惯例,我们得到一个十六进制值,并且在某些系统上,它遵守std::uppercase(和朋友)。 But you cannot rely on that。那些 I/O 操纵器用于 数字,而不是 指针

您实际上可以将指针转换为数字以保证您想要的行为:

cout << "Number of pens = " << nb_of_pens
     << " Address = " << uppercase << hex << uintptr_t(&nb_of_pens)
     << endl;

【讨论】:

  • 您的链接确实增加了一些更有用的信息。
猜你喜欢
  • 2019-07-04
  • 2016-04-17
  • 2015-02-14
  • 2012-10-09
  • 2017-10-18
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多