【问题标题】:When converting pointers to integers, should I be using reinterpret_cast?将指针转换为整数时,我应该使用 reinterpret_cast 吗?
【发布时间】:2021-01-03 02:28:39
【问题描述】:

据我了解,当从指针转换为整数时,我应该使用 reinterpret_cast,因为这可以让我在编译时检查整数变量是否足够大以容纳指针。对吗?

与仅在我没有保证的地方进行转换相反,从 32 位环境迁移到 64 位环境时可能最终截断地址?

【问题讨论】:

  • 我的编译器在(char)pointerreinterpret_cast<char>(pointer) 上发出完全相同的错误。

标签: c++ pointers reinterpret-cast


【解决方案1】:

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

正确...前提是首先需要这种演员阵容,这很少见。

.. 因为这让我在编译时检查整数变量是否足够大以容纳指针。对吗?

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

【讨论】:

    【解决方案2】:

    1.reinterpret_cast 表示重新解释底层位模式。这意味着 C 中的显式转换,例如:

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

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

    如果需要类型安全的转换,请使用static_cast,表示类型之间的隐式转换或类型安全转换。常用于数值类型之间

    2.可能会导致截断,使用精确字长int型为宜。即int64_t 包含<cstdint>

    【讨论】:

    • 你的问题理解有误。
    【解决方案3】:
    1. 您永远不应该这样做(有意义的例外情况很少见)。请解释你为什么需要这个。
    2. 指针在特定平台上具有固定大小。
    3. 标准提供整数类型定义,它与每个平台的指针大小匹配uintptr_t / intptr_t

    【讨论】:

      猜你喜欢
      • 2021-09-09
      • 2016-12-26
      • 1970-01-01
      • 2011-12-31
      • 1970-01-01
      • 2011-08-04
      • 2021-02-13
      相关资源
      最近更新 更多