Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.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++ 将整数转换为指针类型并返回时是否会产生相同的值?_C++_Pointers_Language Lawyer_Integral_Reinterpret Cast - Fatal编程技术网

C++ 将整数转换为指针类型并返回时是否会产生相同的值?

C++ 将整数转换为指针类型并返回时是否会产生相同的值?,c++,pointers,language-lawyer,integral,reinterpret-cast,C++,Pointers,Language Lawyer,Integral,Reinterpret Cast,根据,众所周知,重新解释_cast指向足够大的整数的指针,并返回相同的值。我想知道从标准来看,反过来是否也是正确的。也就是说,reinterpret\u cast一个足够大的指针类型的整数返回是否会产生相同的值?我在库中遇到了这个问题,将指向对象的指针导出为不透明标识符,而现在尝试从外部调用中恢复这些指针对旧的x86 CPU不起作用(在windows 98时代)。因此,虽然我们可以预期这种行为,但在一般情况下这是错误的。在386-CPU中,地址是由重叠的指针组成的,因此任何内存位置的地址都不是唯

根据,众所周知,
重新解释_cast
指向足够大的整数的指针,并返回相同的值。我想知道从标准来看,反过来是否也是正确的。也就是说,
reinterpret\u cast
一个足够大的指针类型的整数返回是否会产生相同的值?

我在库中遇到了这个问题,将指向对象的指针导出为不透明标识符,而现在尝试从外部调用中恢复这些指针对旧的x86 CPU不起作用(在windows 98时代)。因此,虽然我们可以预期这种行为,但在一般情况下这是错误的。在386-CPU中,地址是由重叠的指针组成的,因此任何内存位置的地址都不是唯一的,我发现返回的转换不会恢复原始值。

不,标准不保证这一点。引用C++14(n4140)[expr.reinterpret.cast]中涉及指针-整数转换的所有部分,重点是:

4指针可以显式转换为任何足以容纳它的整数类型。映射函数是 实现定义。[注:对于那些了解寻址结构的人来说,这并不奇怪 基础计算机的名称。-结束注释]

5整数类型或枚举类型的值可以显式转换为指针。转换的指针 返回到一个足够大的整数(如果实现中存在这样的整数)并返回到相同的指针类型 将有其原始价值指针和整数之间的映射由其他实现定义。 [注:除3.7.4.3所述外,此类转换的结果不会是安全派生的指针 价值-尾注]


因此,从一个整数值开始,并将其转换为指针,然后返回(假设没有大小问题)是实现定义的。这意味着您必须查阅编译器的文档,以了解这种往返是否保留值。因此,它肯定不是便携式的。

不,这是不能保证的。例如,不同的整数可能转换为相同的地址。@n.m.您能举个具体的例子吗?注意这里使用的是
reinterpret\u cast
来执行转换。当解释为0x1000:0x2000(段和偏移量)时,整数0x10002000L对应于物理地址0x12000。整数0x12000000L也是如此。没有任何内容阻止编译器将0x100002000L转换为0x1200:0x0000段和偏移量,然后将其转换回0x12000000L。在糟糕的过去,这被称为巨大指针规范化。此外,在某些系统(8051体系结构)上,内存空间非常小,以至于没有足够大的指针类型来容纳uint32\t。8051支持4种指针类型:1字节(idata)、1字节(pdata)、2字节(扩展数据)和3字节(通用指针)。不,不保证整数到指针再到整数的转换。引用自:“…转换为足够大的整数并返回到相同指针类型的指针保证具有其原始值,否则无法安全地取消对结果指针的引用(不保证反向的往返转换;同一指针可能具有多个整数表示形式)。”。