我可以通过reinterpret_cast将int的空指针转换为long类型

时间:2011-04-12 19:49:12

标签: c++ type-conversion reinterpret-cast

int *pt = 0;
long i = reinterpret_cast<long>(pt);

我保证是0吗?这是明确定义还是实现定义? 我检查了c ++标准,但它只说明了

  

指向数据对象或函数(但不是指向成员的指针)的指针可以转换为足以包含它的任何整数类型。

在这种情况下,pt不指向任何数据对象。该规则是否适用于此案例?

4 个答案:

答案 0 :(得分:8)

i不一定是任何值。结果是实现定义的。

C ++中指针的表示是实现定义的,包括空指针的表示。为指针指定整数值零时,将该指针设置为实现定义的空指针值,该值不一定是全位零。将该值转换为整数的结果是通过传递性实现定义的。

更麻烦的是,reinterpret_cast完成的映射无论如何都是实现定义的。因此,即使空指针值是全位 - 零,一个实现也可以自由地产生它想要的结果。你只能保证在你撤退时获得原始价值。

所有人都说,你的报价后面的下一句话包括说明:

  

[注意:对于那些了解寻址结构的人来说,这并不奇怪   底层机器。 - 后注]

所以即使不需要特定的映射,实际上你也可以采取有根据的猜测。


假设long足够大。在C ++ 0x中使用uintptr_t,可选择在<cstddef>中定义。

答案 1 :(得分:0)

我不明白为什么不会。问题是所讨论的整数类型不能保持高值,但如果它是空指针则没有问题。

答案 2 :(得分:0)

是的,它在运行时指向的位置并不重要;唯一重要的是指针的类型。 “对一个数据对象或一个函数”只是意味着“常规”对象指针和函数指针(即指向目标代码的指针)都可以重新转换为数字类型。

我认为上面的代码在所有已知常用平台上安全地将0存储到'i'。

答案 3 :(得分:0)

你想要reinterpret_cast(pt),但是,那会有效。 reinterpret_cast与旧的C样式演员(长)相同,并假设你知道你在做什么。

相关问题