Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 转换为int或其他类型的内存地址的十六进制值的大小是多少?_C++ - Fatal编程技术网

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

C++ 转换为int或其他类型的内存地址的十六进制值的大小是多少?,c++,C++,例如: int* x = new int; int y = reinterpret_cast<int>(x); y现在保存变量x的内存地址的整数值。 变量y的大小为int。该int大小是否始终足够大,以存储转换为int的任何类型的转换内存地址 编辑: 或者使用long int来避免可能的数据丢失更安全 编辑2:对不起,大家,为了让这个问题更容易理解,我想在这里找到的是返回的十六进制值作为一个数字的大小,不是int的大小,也不是指向int的指针的大小,而是普通的十六进制值。我需要用人

例如:

int* x = new int;
int y = reinterpret_cast<int>(x);
y现在保存变量x的内存地址的整数值。 变量y的大小为int。该int大小是否始终足够大,以存储转换为int的任何类型的转换内存地址

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


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

在大多数64位目标上,int仍然是32位的,而指针是64位的,所以它不起作用


不,那不安全。不能保证sizeofint==sizeofint*

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

至于十六进制值。。。我不知道你在说什么。如果你说的是十六进制指针的文本表示法。。。你需要一根绳子

编辑以尝试根据评论帮助OP:

因为计算机不是十六进制的。我不知道该怎么解释。整数和长整数一样存储一定量的二进制位。十六进制是这些位的文本表示,具体来说,是base16表示。字符串用于值的文本表示。如果需要指针的十六进制表示形式,则需要将该指针转换为文本十六进制

这是一个C++例子,说明你如何做:

test.cpp 样本输出:

roach$g++-o test.cpp 蟑螂$/试验 0x7fff68e07730


值得注意的是,当你想看到一个数字的十进制表示形式base10时,同样需要做的事情——你必须将它转换成字符串。内存中的所有内容都存储在二进制base2中,您可能需要使用std::ostream的地址格式:

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

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

有一个问题可以解决类似的问题:

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

谢谢,但是转换的内存十六进制值的大小是多少?int的大小是否足以存储转换后的十六进制内存值?不,您不应该依赖int来保存指针值。我想你穿上长的还是安全的,或者最好穿上尺码。从内存来看,它可以在某些系统上工作,但不能在64位Linux或Windows上工作。用cout@codekiddy检查你的系统:为什么是十六进制?因为调试器将其显示为十六进制?不管怎么说,不管是不是妖术,这都是无关紧要的。x是指针值。正如其他人已经指出的,它可能不适合int,甚至可能不适合long。它将适合uintptr\t。如果您的编译器不支持uintptr\t,那么次好的方法是size\t。@codekiddy:但是没有十六进制值。这只是一个价值。如何将其打印或保存为二进制、八进制、十进制、十六进制或其他格式完全与值本身无关。如果你想让它在某个地方看起来像十六进制,你必须把它转换成一个包含十六进制数字的字符串来组成/表示这个值。@codekiddy:它可以表示为某个东西并不意味着它已经表示为那个东西。C++中的所有不同对象都有唯一的地址,我们不是通过引用或联合变量来描述别名。使用sisitht或更正确的-uTunpTrt来匹配指针大小。我不认为你理解十六进制值是什么意思。没有内存十六进制值这样的东西。你有一个指针。它是由一些位组成的。你可以随意用文本表示,但这与你发布的代码无关。@Brian Roach,也许我不明白,但内存地址看起来像0x0f3a89bb,不是十六进制值吗?每个对象都有这样的uniqe内存地址。那么你怎么认为没有内存十六进制值呢?谢谢。@codekiddy-是的,那是一个十六进制数。不管你用什么来证明这一点
将一组位值转换为十六进制文本表示并显示给您。如果这是你需要的,你也需要这样做。计算机没有十六进制的概念;它们以二进制形式运行。我输入+1。从OP的最新编辑判断,他显然仍然不清楚物理数据存储和POD整数的文本表示之间的区别。是的,这也是我的怀疑。@Brian,你说我需要一个字符串来存储指针的十六进制表示。。。为什么是字符串?我想问的int或lon有什么问题吗?非常感谢。
int x(0);
std::cout << &x << '\n';