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

2024-06-18

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

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

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

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


No, i is not necessarily any value. The result is implementation-defined.

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

但更麻烦的是,由reinterpret_cast无论如何都是实现定义的。因此,即使空指针值全部为零,实现也可以自由地产生任何它想要的结果。仅保证您在回传时会获得原始值。

话虽如此,您引用后的下一句话包括注释:

[注:目的是让那些知道寻址结构的人不会感到惊讶 底层机器的。 ——尾注]

因此,尽管不需要特定的映射,但实际上您可以进行有根据的猜测。


Assuming long is large enough. In C++0x use uintptr_t, optionally defined in <cstddef>.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以通过reinterpret_cast将int的空指针转换为long类型吗 的相关文章

随机推荐