首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >转换为int或其他类型的内存地址的十六进制值的大小是多少?

转换为int或其他类型的内存地址的十六进制值的大小是多少?
EN

Stack Overflow用户
提问于 2012-01-05 02:52:00
回答 4查看 8.3K关注 0票数 0

例如:

代码语言:javascript
复制
int* x = new int;
int y = reinterpret_cast<int>(x);

y现在保存变量x的内存地址的整数值。变量y的大小为int。该int大小是否总是足够大以存储转换为int的任何类型的转换内存地址?

编辑:还是使用long int来避免数据丢失更安全?

编辑2:不好意思,为了让这个问题更容易理解,我想在这里了解的是返回的HEX值作为一个数字的大小,不是int的大小,也不是int的大小,而是普通的十六进制值。我需要用人类可读的表示法来得到这个值。这就是我使用reinterpret_cast将内存HEX值转换为DEC值的原因。但是为了安全地存储这个值,我还需要把它放入一个什么样的变量中: int,long -哪个类型足够大?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-05 03:04:20

不那不安全。不能保证sizeof(int) == sizeof(int*)

在64位平台上,您几乎可以保证它不是。

至于“十六进制值”..。我不知道你在说什么。如果你是在用十六进制来表示指针.你需要一根绳子。

编辑尝试帮助基于注释的OP:

因为电脑不能正常工作。我不知道还能怎么解释。int存储一定数量的位(二进制),长存储也是如此。十六进制是这些位的文本表示(特别是base16表示)。字符串用于值的文本表示。如果需要指针的十六进制表示,则需要将该指针转换为文本(十六进制)。

下面是一个如何做到这一点的c++示例:

test.cpp

代码语言:javascript
复制
#include <string>
#include <iostream>
#include <sstream>

int main()
{

    int *p; // declare a pointer to an int. 
    std::ostringstream oss; // create a stringstream
    std::string s; // create a string

    // this takes the value of p (the memory address), converts it to 
    // the hexadecimal textual representation, and puts it in the stream
    oss << std::hex << p;

    // Get a std::string from the stream
    s = oss.str();

    // Display the string
    std::cout << s << std::endl;

}

样本输出:

roach$ g++ -o test test.cpp

roach$ ./test

0x7fff68e07730

值得注意的是,当您想要看到一个数字的base10 (十进制)表示时,也需要同样的东西--您必须将它转换为一个字符串。内存中的所有内容都以二进制形式存储(base2)。

票数 7
EN

Stack Overflow用户

发布于 2012-01-05 02:55:02

在大多数64位目标上,int仍然是32位,而指针是64位,所以不能工作。

http://en.wikipedia.org/wiki/64-bit#64-bit_data_models

票数 2
EN

Stack Overflow用户

发布于 2012-01-05 03:46:43

您可能想要的是使用std::ostream的地址格式:

代码语言:javascript
复制
int x(0);
std::cout << &x << '\n';

至于产生的字符串的长度,您需要确定相应指针的大小:对于每个使用过的字节,输出将使用两个十六进制数字,因为每个十六进制数字可以表示16个值。所有字节通常都被使用,即使不太可能为所有字节拥有内存,例如当指针的大小为8字节时,就像在64位系统上所发生的那样。这是因为堆栈通常从最大的地址向下增长,而可执行代码则从地址范围的开头开始(如果以任何方式触摸,那么第一页就可能被用来造成分段冲突)。在可执行代码上面有一些数据段,后面跟着堆,还有大量未使用的页面。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8737019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档