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

what's the size of hex value of some memory address converted to int or other type?

本文关键字:十六进制 多少 地址 int 其他 类型 转换 内存      更新时间:2023-10-16

例如:

int* x = new int;
int y = reinterpret_cast<int>(x);

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

编辑:

或者使用long int来避免可能的数据丢失更安全?

EDIT 2:对不起的人,为了使这个问题更容易理解,我想在这里找出的是返回的十六进制值的大小作为一个数字,而不是int的大小也不是指针的大小int但普通十六进制值。我需要用人类可读的符号来表示这个值。这就是为什么我使用reinterpret_cast将该内存HEX值转换为DEC值。但是为了安全地存储值,我还需要找出它的变量类型:int, long -什么类型足够大?

不,那不安全。没有保证sizeof(int) == sizeof(int*)

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

对于"十六进制值"…我不知道你在说什么。如果你说的是十六进制指针的文本表示…你需要一个字符串

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

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

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

<标题> test.cpp h1>

$ g++ - 0 test test.cpp罗奇。美元/测试
0 x7fff68e07730

值得注意的是,当你想要看到一个数字的base10(十进制)表示时,也需要做同样的事情——你必须把它转换成一个字符串。内存中的所有内容都以二进制(base2)形式存储

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

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

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

int x(0);
std::cout << &x << 'n';

对于生成的字符串的长度,需要确定相应指针的大小:对于每个使用的字节,输出将使用两个十六进制数字,因为每个十六进制数字可以表示16个值。所有字节通常被使用,即使你不太可能有所有字节的内存,例如,当指针的大小是8字节时,发生在64位系统上。这是因为堆栈通常从最大的地址向下增长,而可执行代码从地址范围的开始开始(好吧,如果以任何方式触摸,第一页可能未被使用,从而导致分段违规)。在可执行代码的上面有一些数据段,然后是堆和许多未使用的页面。

有一个类似的问题:

https://stackoverflow.com/a/2369593/1010666

总结:不要尝试将指针写入非指针变量。如果您需要打印出指针的值,还有其他的解决方案。