8

我不确定之前是否有人问过,但我相信一定是这样。考虑问题开始的简单行:

int a ;
char b = reinterpret_cast<char> (a);

我理解reinterpret_cast将 x 类型的位模式解释为 y 类型,因为它不应该由于大小不匹配而工作,实际上它没有。

现在考虑另一个代码:

int a ;
char b = static_cast<char> (a);

这行得通!. 现在我的问题是它如何工作?我的意思是编译器会砍掉这些位吗?. 我很确定sizeof(char) < sizeof(int)。如果是这样,reinterpret_cast也应该使用相同的技术吗?

4

2 回答 2

7

int从到有一个明确定义的转换char;就是static_cast这样。事实上,你不需要演员表。你可以在这里使用一个作业。另一方面,reinterpret_cast说假装一种类型的对象中的位代表另一种类型的对象;对于某些类型可以(或多或少),但是没有明智的方法可以假装 int 中的位可以在不应用转换的情况下用作 char 中的位,并且reinterpret_cast不这样做。

于 2013-02-17T17:51:22.013 回答
3

static_cast 可以强制发生定义的转换,也可以反转定义的转换(添加或删除 const/volatile 除外)。你认为 reinterpret_cast 是一些可以做任何事情的超级演员。事实并非如此。它有一组定义的转换。

它可以将一种类型的指针转​​换为另一种类型的指针(只要保留 const/volatile)。对于引用,它同样可以这样做。它可以将指针转换为整数类型,反之亦然。

除此之外,它什么也不做,而且你的程序格式不正确。

于 2013-02-17T17:59:26.737 回答