转换为 int 或其他类型的某些内存地址的十六进制值的大小是多少?
what's the size of hex value of some memory address converted to int or other type?
例如:
int* x = new int;
int y = reinterpret_cast<int>(x);
y
现在保存变量x
的内存地址的整数值。变量y
的大小为int
。int
的大小是否总是大到足以存储转换为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总结:不要尝试将指针写入非指针变量。如果您需要打印出指针的值,还有其他的解决方案。
- 如何在openssl-ecc中获取十六进制格式的私钥
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 通过错误处理,在C++中可靠地获得用户十六进制输入
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 指向存储在字符串 c++ 中的十六进制
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- C ++如何使用UTF8十六进制代码打印UTF8符号?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 如何在C++中将十六进制字符串转换为文本数据
- 使用 sprintf 将十六进制0xAABBCC转换为字符串"AA:BB:CC"
- 绝对编码器十六进制输入
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- C++17 十六进制浮点文字单精度后缀冲突?
- 是否可以在C++中获取 CHAR 的有效十六进制地址?
- (1 << 27)的十六进制值是多少?
- 转换为 int 或其他类型的某些内存地址的十六进制值的大小是多少?