微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

||
int *pt = 0;
long i = reinterpret_cast<long>(pt);
我保证为0吗?这是定义明确或实现定义明确的吗? 我检查了c ++标准,但只说   指向数据对象或函数的指针(但不指向成员的指针)可以转换为足够大的整数类型以容纳它。 在这种情况下,pt不会指向任何数据对象。该规则适用于这种情况吗?     

解决方法

不,
i
不一定是任何值。结果是实现定义的。† 在C ++中,指针的表示是实现定义的,包括空指针的表示。当您为指针分配一个整数值零时,您可以将该指针设置为实现定义的空指针值,该值不一定是全零位。通过传递性,将该值转换为整数的结果由实现定义。 尽管如此,更麻烦的是无论如何还是由实现定义由
reinterpret_cast
完成的映射。因此,即使空指针的值是全零位,实现也可以随意获得所需的结果。您只能保证在返回时会获得原始值。 综上所述,引号后的下一个句子包括注释:   [注意:对于那些知道寻址结构的人来说,这并不奇怪   基础机器的。 —尾注] 因此,即使不需要特定的映射,实用上您也可以进行有根据的猜测。 †假设
long
足够大。在C ++ 0x中使用
uintptr_t
,可以选择在
<cstddef>
中定义。     ,我不明白为什么不会。问题在于所讨论的整数类型不能保持那么高的值,但是如果它是空指针,就没有问题。     ,您需要reinterpret_cast(pt),但是可以。 reinterpret_cast与旧的C样式强制转换(长整数)相同,并假定您知道自己在做什么。     ,是的,在运行时指向何处都没有关系;唯一重要的是指针的类型。 “指向数据对象或函数”仅表示“常规”对象指针和函数指针(即指向对象代码的指针)都可以重铸为数字类型。 我认为您上面的代码可以在所有已知的通用平台上安全地将0存储到\'i \'。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。