【问题标题】:question about reinterpret_cast关于 reinterpret_cast 的问题
【发布时间】:2010-07-29 14:52:06
【问题描述】:

我有以下代码

#include <iostream>
using namespace std;
int main(){

    int i;
     char *p="this is a string";
     i=reinterpret_cast<int>(p);
     cout<<i<<"\n":



     return 0;
}

输出是: 7648 请解释 reinterpret_cast

【问题讨论】:

    标签: c++ reinterpret-cast


    【解决方案1】:

    reinterpret_cast 导致您正在转换的数据被视为不同的类型,而不执行任何转换。根据标准,在reinterpret_cast 之后定义的唯一行为是将reinterpret_cast 恢复为原始类型。

    这听起来有点没用,但您可能想要使用它的一个原因是,例如,在 C++ 中使用某些 C 库(例如 pthreads)。许多涉及回调的 C 库将 void* 类型的参数传递给回调。在 C++ 中,处理此问题的正确方法是将指针指向您想要用作参数的任何内容,reinterpret_cast 在将其传递到 C 库时将其指向 void*,然后将 reinterpret_cast 返回到任何内容它实际上在回调中。

    虽然标准不保证定义行为,但在大多数平台/编译器上,reinterpret_cast 所做的只是将数据视为不同的类型,使用相同的位图案。例如,如果您有一个 32 位双精度 d,其位模式恰好是 01101010 00111100 01101010 01000001,而您编写 int i = reinterpret_cast&lt;int&gt;(d),那么 i 将是一个位模式为 01101010 00111100 01101010 01000001 的整数,尽管这将用整数表示一个完全不同的数值,而不是用双精度表示。显然,如果所涉及的类型大小不同,这会让您很快陷入困境。

    【讨论】:

      【解决方案2】:

      here

      究竟什么不清楚?请具体。在你问之前也搜索一下,SO上有很多关于这个的问题。

      【讨论】:

        【解决方案3】:

        reinterpret_cast&lt;&gt; 将在不检查 p 指向 int 的指针的情况下进行转换,但您不能做出任何假设 int 将代表什么。您唯一能做的就是将此指针转换回原来的样子。

        更实际一点,您的编译器很可能会将地址p 指向int 值,但int 的大小可能与系统指针大小不匹配,因此您可能应该使用一些东西比如uintptr_t,而不是int

        您可以使用 Boost lexical_cast&lt;&gt; 之类的东西,它会尝试将整数的字符串表示形式转换为真正的整数值,但我不确定这是您的目标。

        【讨论】:

        • 他将 char 指针转换为 int,而不是将 char 指针转换为 int。反正它是未定义的。
        • 除非这个答案仍然是错误的。如果在这种情况下我们不能使用reinterpret_cast,我们还能使用什么?将char* 之类的不相关的东西投射到int 正是reinterpret_cast 的用途。当然,根据标准,结果可能是任何东西,并且高度依赖于平台。但是当你需要这个时,你reinterpret_cast就是标准提供的。
        • 如果您想以定义的方式执行此操作,您应该使用uintptr_t 作为整数类型。那么使用reinterpret_cast应该是完全没问题的。
        【解决方案4】:

        没什么好解释的。 reinterpret_cast 的结果是特定于平台的。您要测试的输出可能是字符串常量的地址,或者当它被强制转换为int 时它的任何剩余部分。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-26
          • 1970-01-01
          • 2010-12-24
          • 2015-12-14
          • 1970-01-01
          • 2021-11-29
          • 2011-09-22
          • 2018-05-23
          相关资源
          最近更新 更多