如何在c ++中以大写形式打印地址(十六进制值)

时间:2015-03-01 15:11:29

标签: c++

我试图以十六进制的形式打印变量的地址(引用),也是大写的。但我发现我能够以大写形式打印等效于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。 我该怎么做?

3 个答案:

答案 0 :(得分:6)

  

“我希望地址打印为: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操纵器生效。

答案 1 :(得分:1)

printf("%p", &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;

答案 2 :(得分:0)

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

我知道这是一种非常黑客的做法。

编辑:这也会将第二个'x'变换为'X'