【问题标题】:Can I convert a null pointer of int to a long type by reinterpret_cast我可以通过 reinterpret_cast 将 int 的空指针转换为 long 类型吗
【发布时间】:2011-08-04 04:30:23
【问题描述】:

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

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

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

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

【问题讨论】:

  • 它充其量是实现定义的,因为long 可能没有“大到足以包含”转换后的指针值。

标签: c++ type-conversion reinterpret-cast


【解决方案1】:

我不明白为什么它不会。问题是所讨论的整数类型无法保存那么高的值,但如果它是空指针,则没有问题。

【讨论】:

    【解决方案2】:

    是的,它在运行时指向的位置无关紧要;唯一重要的是指针的类型。 “指向数据对象或函数”只是意味着“常规”对象指针和函数指针(即指向对象代码的指针)都可以重铸为数字类型。

    我认为您上面的代码在所有 已知 通用平台上安全地将 0 存储到“i”。

    【讨论】:

    • 所有常见平台,但不是所有已知平台。在某些分段架构中,空指针常量并非全位为零。
    • Ok :) 已更改 :) 但是,它不是 OP 代码中的 NULL 指针,它首先将字面量 '0' 存储到指针中......这是否会被转换为非这些平台上的位零指针值?只是好奇:) ??
    • @antii:NULL0 都表示相同的整数值,并且都转换为特定于实现的空指针。 (所以是的。)
    【解决方案3】:

    您想要 reinterpret_cast(pt) ,但是是的,这会起作用。 reinterpret_cast 与旧的 C 风格转换(长)相同,并假设您知道自己在做什么。

    【讨论】:

      【解决方案4】:

      i 不一定是任何值。结果是实现定义的。

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

      不过,更麻烦的是,reinterpret_cast 完成的映射无论如何都是实现定义的。因此,即使空指针值全为零,实现也可以随意生成任何它想要的结果。只保证你在回退时会得到原始值。

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

      [ 注意:它旨在让那些知道寻址结构的人不足为奇 底层机器。 ——尾注]

      因此,即使不需要特定的映射,您也可以根据实际情况进行有根据的猜测。


      假设 long 足够大。在 C++0x 中使用 uintptr_t,可以在 &lt;cstddef&gt; 中定义。

      【讨论】:

      • 我相信这是正确的答案。但我还有另一个问题。这是将指针转换为整数的唯一方法吗?当您执行cout &lt;&lt; pt; 时,编译器在后台做了什么?
      • @C--:输出指针值时,格式也是实现定义的。您是否需要将指针转换为整数以用于特定目的?
      猜你喜欢
      • 2010-10-25
      • 2013-01-10
      • 2019-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多