【问题标题】:print 64bit c++ full memory address打印 64bit c++ 全内存地址
【发布时间】:2015-05-19 12:43:24
【问题描述】:

当我在 64 位机器上为 c++ 程序编写代码时,我注意到打印变量的地址(例如)只返回 12 个十六进制字符,而不是 16 个。这是一个示例代码:

int a = 3 ;
cout sizeof(&a) << " bytes" << endl ;
cout << &a << endl ;

输出是:

8 个字节

0x7fff007bcce0

显然,变量的地址是 8 字节(64 位系统)。但是当我打印它时,我只得到 12 个十六进制数字而不是 16 个。

  • 为什么会这样?我认为这是因为 4 个“丢失”的数字 是前导零,未打印。但这只是我的 想,我希望有一个明确的和技术上正确的 回答。

  • 如何打印整个地址?有没有内置的解决方案, 或者我应该手动使用“sizeof”以获得真正的长度和 然后在地址中添加正确数量的零?

原谅我,我用谷歌搜索了一天的愚蠢问题的答案,但我找不到答案。我只是一个新手。 (在stackoverflow上,我没有找到任何关于我需要知道的问题/答案,但也许我错了。)

【问题讨论】:

    标签: c++ 64-bit cout memory-address


    【解决方案1】:

    有人在这里问了一个非常相似的问题:c++ pointer on 64 bit machine

    希望这会有所帮助:)

    要打印带前导零的完整 64 位地址,您可以使用:

    std::cout
    << "0x"
    << std::hex
    << std::noshowbase
    << std::setw(16)
    << std::setfill('0')
    << n
    << std::endl ;
    

    来自:How can I pad an int with leading zeros when using cout << operator?

    【讨论】:

    • 太棒了!我不知道大多数系统只使用了 48 个字节......所以 48/4 = 12 hex digits 。由于您的快速回答,这是我刚刚学到的新东西:)
    • 但是地址的长度是 64 位的(c++ 将它存储在 8 个字节中),所以,我怎样才能打印整个地址,前导零?在您链接的问题/答案中,有人写了关于 std::hex 操纵器的文章......我该如何使用它?而且,它是否允许我打印整个地址(所以它的所有 8 个字节)?
    • 我只是从其他地方复制并粘贴代码:std::cout &lt;&lt; "0x" &lt;&lt; std::hex &lt;&lt; std::noshowbase &lt;&lt; std::setw(16) &lt;&lt; std::setfill('0') &lt;&lt; &amp;a &lt;&lt; std::endl ;
    • 所以,这是打印我要求的内容的一种解决方法......而且很好。但是有没有办法打印带有前导零的十六进制值,而不必人为地添加零?我的意思是,一个指针存储一个 8 字节的地址,例如 0x00001234567890ab,这个值在打印出来时更短,因为流不考虑前导零。所以输出只会是 0x1234567890ab,而你发布的解决方案是我们必须拆分这个字符串并添加四个零。如果存储的值为 0x0000ab,是否有什么东西可以直接打印 0x0000ab 而没有变通方法?
    • 我一无所知-您可以将旧的 c 函数 printf 与 printf("%16X", &amp;a) 一起使用。不确定这是否更适合您。
    【解决方案2】:

    我目前正在为像你这样的窥视者写一本关于 C++ 和 windows 32 位编程的书,但不幸的是我还没有完成它:(

    以下代码演示了如何使用 cout 方法显示 64 位无符号数:

    // Define a 64-bit number. You may need to include <stdint.h> header file depending on your C++ compiler.
    
    uint64_t UI64 = 281474976709632ULL; // Must include ULL suffix and this is C99 C++ compiler specific.
    
    // unsigned __int64 UI64 = 281474976709632ULL; // Must include ULL suffix and this is Microsoft C++ compiler specific.
    
    // Set decimal output.
    
    cout << dec;
    
    // Display message to user.
    
    cout << "64-bit unsigned integer value in decimal is: " << UI64 << endl;
    
    cout << "\n64-bit unsigned integer value in hexadecimal is: ";
    
    // Set the uppercase flag to display hex value in capital letters.
    
    cout << uppercase;
    
    // Set hexadecimal output.
    
    cout << hex;
    
    // Set the width output to be 16 digits.
    
    cout.width(16);
    
    // Set the fill output to be zeros.
    
    cout.fill('0');
    
    // Set right justification for output.
    
    right(cout);
    
    // Display the 64-bit number.
    
    cout << UI64 << endl;
    

    您可能需要(类型)将地址转换为 64 位无符号值。 在这种情况下,您可以执行以下操作:

    // (type) cast pointer adddress into an unsigned 64-bit integer.
    
    uint64_t UADD64 = (uint64_t)&UI64; // C99 C++ compiler specific.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 2014-07-26
      • 1970-01-01
      • 2019-03-22
      相关资源
      最近更新 更多