问题描述
据我了解,当从指针转换为整数时,我应该使用reinterpret_cast,因为这使我可以进行编译时检查,以确保整数变量足够大以适合指针。正确吗?
相对于仅在没有保证的情况下进行强制转换,并且从32位环境迁移到64位环境时,最终可能会截断地址吗?
解决方法
1。reinterpret_cast
表示重新解释基础位模式。这意味着在C中进行显式转换,例如:
void *vptr;
int *iptr = (int *)(vptr);
您应该知道reinterpret_cast是不安全的,转换的正确性由您自己决定。
如果需要类型安全的转换,请使用static_cast
,这意味着类型之间的隐式强制转换或类型安全的强制转换。经常在数字类型之间使用
2。这可能会导致截断,使用精确的字长int-type是合适的。即int64_t
通过包含<cstdint>
- 您永远不要这样做(有意义的例外非常罕见)。请解释为什么需要这个。
- 指针在特定平台上具有固定大小。
- Standard提供了与每个平台uintptr_t / intptr_t的指针大小相匹配的整数类型定义。
我应该使用reinterpret_cast ...是吗?
更正...,前提是首先需要进行这样的转换,这种情况很少见。
..因为这使我可以在编译时检查整数变量是否足够大以适合指针。正确吗?
不正确。与c样式强制转换相比,警告没有任何额外的保证。首选Reinterpret_cast,因为它更明确,并且不允许抛弃const。