将指针转换为整数时,我应该使用reinterpret_cast吗?

问题描述

据我了解,当从指针转换为整数时,我应该使用reinterpret_cast,因为这使我可以进行编译时检查,以确保整数变量足够大以适合指针。正确吗?

相对于仅在没有保证的情况下进行强制转换,并且从32位环境迁移到64位环境时,最终可能会截断地址吗?

解决方法

1。reinterpret_cast表示重新解释基础位模式。这意味着在C中进行显式转换,例如:

void *vptr; 
int *iptr = (int *)(vptr);

您应该知道reinterpret_cast是不安全的,转换的正确性由您自己决定。

如果需要类型安全的转换,请使用static_cast,这意味着类型之间的隐式强制转换或类型安全的强制转换。经常在数字类型之间使用

2。这可能会导致截断,使用精确的字长int-type是合适的。即int64_t通过包含<cstdint>

,
  1. 您永远不要这样做(有意义的例外非常罕见)。请解释为什么需要这个。
  2. 指针在特定平台上具有固定大小。
  3. Standard提供了与每个平台uintptr_t / intptr_t的指针大小相匹配的整数类型定义。
,

我应该使用reinterpret_cast ...是吗?

更正...,前提是首先需要进行这样的转换,这种情况很少见。

..因为这使我可以在编译时检查整数变量是否足够大以适合指针。正确吗?

不正确。与c样式强制转换相比,警告没有任何额外的保证。首选Reinterpret_cast,因为它更明确,并且不允许抛弃const。