reinterpret_cast的使用问题

winmenaruto 2012-10-18 04:14:18
int n=9;

double d=reinterpret_cast<double&> (n);//corrcet
double d=reinterpret_cast<double> (n);//wrong
cout<< d;

问题是 why ?
...全文
513 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
winmenaruto 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 的回复:]

引用 20 楼 的回复:我感觉似乎用static比较合理..为什么wdk用reinterpret,这个似乎强转,有出错的机会,static根据你的类型来转换,多好

除了默认的/内置的转换和指针的reinterpret_cast,其它转换需要你去定义的

C/C++ code
struct A
{
int a;
};

struct B
{
operator A()
……
[/Quote]
饿..什么意思
十八道胡同 2012-10-25
  • 打赏
  • 举报
回复
reinterpret_cast
解释:操作符修改了操作数类型,但仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换。
例子:int *n= new int ;
  double *d=reinterpret_cast<double*> (n);
  在进行计算以后, d 包含无用值. 这是因为 reinterpret_cast 仅仅是复制 n 的比特位到 d, 没有进行必要的分析。
reinterpret_cast是为了映射到一个完全不同类型的意思,这个关键词在我们需要把类型映射回原有类型时用到它。我们映射到的类型仅仅是为了故弄玄虚和其他目的,这是所有映射中最危险的。(这句话是C++编程思想中的原话)
  static_cast和reinterpret_cast的区别主要在于多重继承,比如
  class A { public: int m_a; };
  class B { public: int m_b; };
  class C : public A, public B {};
  那么对于以下代码:
  C c;
  printf("%p, %p, %p\r\n", &c, reinterpret_cast<B*>(&c), static_cast <B*>(&c));
  前两个的输出值是相同的,最后一个则会在原基础上偏移4个字节,这是因为static_cast计算了父子类指针转换的偏移量,并将之转换到正确的地址,而reinterpret_cast却不会做这一层转换。
  因此, 你需要谨慎使用 reinterpret_cast.
buyong 2012-10-25
  • 打赏
  • 举报
回复
// dynamic_cast_1.cpp
// compile with: /c
class B { };
class C : public B { };
class D : public C { };

void f(D* pd) {
C* pc = dynamic_cast<C*>(pd); // ok: C is a direct base class
// pc points to C subobject of pd
B* pb = dynamic_cast<B*>(pd); // ok: B is an indirect base class
// pb points to B subobject of pd
}

你忘了写 dynamic_cast后的指针类型,可能这是你得到空指针的原因
winmenaruto 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

reinpreter_cast<type-id> (expression_r_r)

type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。
[/Quote]
你能帮忙看一下3楼的问题吗?
Eleven 2012-10-25
  • 打赏
  • 举报
回复
reinpreter_cast<type-id> (expression_r_r)

type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。
winmenaruto 2012-10-25
  • 打赏
  • 举报
回复
自己顶一顶..
yisikaipu 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]我感觉似乎用static比较合理..为什么wdk用reinterpret,这个似乎强转,有出错的机会,static根据你的类型来转换,多好[/Quote]

除了默认的/内置的转换和指针的reinterpret_cast,其它转换需要你去定义的

struct A
{
int a;
};

struct B
{
operator A()
{
A temp;
temp.a=b;

return temp;
}

int b;
};

int main()
{
B b;
A a=static_cast<A>(b);

return 0;
}

winmenaruto 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]

int n=9;

内存 小端 09 00 00 00

但是这块内存如果解读为double

double d=*(double*)&n; // 这就是reinterpret_cast

那就是d就是8.6141315696424017e-308

至于为什么这样,参考IEEE浮点标准

可是如果你写double d=n; // 这就是static_cast
……
[/Quote]
详细 谢谢
那在上面的例子中:
PPCI_BUS_INTERFACE_STANDARD pInterface = reinterpret_cast<PPCI_BUS_INTERFACE_STANDARD>(pIrpStack->Parameters.QueryInterface.Interface);

我感觉似乎用static比较合理..为什么wdk用reinterpret,这个似乎强转,有出错的机会,static根据你的类型来转换,多好
yisikaipu 2012-10-25
  • 打赏
  • 举报
回复
int n=9;

内存 小端 09 00 00 00

但是这块内存如果解读为double

double d=*(double*)&n; // 这就是reinterpret_cast

那就是d就是8.6141315696424017e-308

至于为什么这样,参考IEEE浮点标准

可是如果你写double d=n; // 这就是static_cast

那么会调用指令把n换算成浮点编码 00 00 00 00 00 00 22 40

至于为什么这样,还是参考IEEE浮点标准



yisikaipu 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

同样int转double 可能reinterrept转出来的值不对 static转出来就正确了...我感觉static靠谱一点...但是这里为什么你说只能用reinterpret ?
[/Quote]

不是靠谱程度不同,而是原理就不一样啊

比如你这个例子吧,int n=9

待续
yisikaipu 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]几乎是2个struct吧..你指的默认转换关系是什么? 子类,父类这种??[/Quote]

那么reinterpret_cast就是干这个的

它就是把指针的类型转换一下

只有有继承关系的时候,才用dynamic_cast

默认转换不是术语,我的意思指的float转double之类的,可以static_cast,也可以什么都不写
winmenaruto 2012-10-25
  • 打赏
  • 举报
回复
同样int转double 可能reinterrept转出来的值不对 static转出来就正确了...我感觉static靠谱一点...但是这里为什么你说只能用reinterpret ?
winmenaruto 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

关键是 pIrpStack->Parameters.QueryInterface.Interface 这个的类型是什么?是IO_STACK_LOCATION?

那么这个和PCI_BUS_INTERFACE_STANDARD有什么关系?如果不存在默认的什么转换,那么只能reinterpret吧
[/Quote]
是IO_STACK_LOCATION的.
几乎是2个struct吧..你指的默认转换关系是什么? 子类,父类这种??
yisikaipu 2012-10-25
  • 打赏
  • 举报
回复
关键是 pIrpStack->Parameters.QueryInterface.Interface 这个的类型是什么?是IO_STACK_LOCATION?

那么这个和PCI_BUS_INTERFACE_STANDARD有什么关系?如果不存在默认的什么转换,那么只能reinterpret吧
winmenaruto 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 11 楼 的回复:这里为什么不用dynamic或者是static ?

不懂这个具体内容

贴更多代码看看
[/Quote]
这个代码前后超多 换一个问:
 PPCI_BUS_INTERFACE_STANDARD pInterface = reinterpret_cast<PPCI_BUS_INTERFACE_STANDARD>(pIrpStack->Parameters.QueryInterface.Interface);

这里为什么不用dynamic或者是static ?

这2个结构体网上都有:
http://hi.baidu.com/taozpwater/item/97073614d7488537b8318064

  typedef struct _PCI_BUS_INTERFACE_STANDARD {
/*0x000*/ UINT16 Size;
/*0x002*/ UINT16 Version;
/*0x004*/ VOID* Context;
/*0x008*/ PVOID InterfaceReference;
/*0x00C*/ PVOID InterfaceDereference;
/*0x010*/ PVOID ReadConfig;
/*0x014*/ PVOID WriteConfig;
/*0x018*/ PVOID PinToLine;
/*0x01C*/ PVOID LineToPin;
}PCI_BUS_INTERFACE_STANDARD, *PPCI_BUS_INTERFACE_STANDARD;
yisikaipu 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]这里为什么不用dynamic或者是static ?[/Quote]

不懂这个具体内容

贴更多代码看看
winmenaruto 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 3 楼 的回复:给你转换 ,转换好后为空..没意思啊

这样可以判断是否转换成功啊,可以判断一个指针是不是某种指针,是的话这么办,不是的话就那么办。否则编译都通不过
[/Quote]
哦..谢谢
我看wdk看到一个代码:
FTimer* pTimer = reinterpret_cast<FTimer*>(pContext);

这里为什么不用dynamic或者是static ?
yisikaipu 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]给你转换 ,转换好后为空..没意思啊[/Quote]

这样可以判断是否转换成功啊,可以判断一个指针是不是某种指针,是的话这么办,不是的话就那么办。否则编译都通不过
winmenaruto 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

// dynamic_cast_1.cpp
// compile with: /c
class B { };
class C : public B { };
class D : public C { };

void f(D* pd) {
C* pc = dynamic_cast<C*>(pd); // ok: C is a direct base class
……
[/Quote]

当然不是 我调试的时候这么写的:
D *pd2 = dynamic_cast<D*>(pb);
winmenaruto 2012-10-24
  • 打赏
  • 举报
回复
另外,dynamic_cast还支持交叉转换(cross cast)。如下代码所示。
class A{
public:
int m_iNum;
virtual void f(){}
};

class B:public A{
};

class D:public A{
};

void foo(){
B *pb = new B;
pb->m_iNum = 100;

D *pd1 = static_cast(pb); //compile error
D *pd2 = dynamic_cast(pb); //pd2 is NULL
delete pb;
}

在函数foo中,使用static_cast进行转换是不被允许的,将在编译时出错;而使用 dynamic_cast的转换则是允许的,结果是空指针。
那我搞不懂了 红色字,dynamic他的意义何在? 给你转换 ,转换好后为空..没意思啊
加载更多回复(2)

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧