强制类型转换原理

作者:pansz
链接:https://www.zhihu.com/question/20482511/answer/15262336
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

所谓强制转换,其实也分不同的类型。一个强制转换语句,在不同的场合下,有不同的含义。大体上来看,在 C 语言里面,强制类型转换有两种含义:

1,将一个数据,复制为另外一个数据类型,并且使用新类型的数据,此时可以认为新类型的数据,在内存结构方面与原有数据没有任何关系,这是实实在在的发生了转换,而且执行这个转换相关的代码是编译器生成的。例如:
char c = 'c';
int i = (int) c;
在上面的例子中,字符 c 被转化成了 int,两者是完全不同的数据,其内存占用的长度也完全不同。
2,将一个数据,当作另外一个数据类型使用,让编译器认为这就是另外一个数据类型,此时数据没有发生任何转换,在计算机的角度没有任何事情发生,也不为这个转换生成任何代码,只是编译器认为这个语句合法了。例如:
long l = 0x10000000L;
volatile void *p = (void *) l;

在这句话中,变量 l 被『直接视为』指针 p,从内存数据的角度没有发生任何转换,这个转换只是让编译器认为这个赋值合法而已。
在 C++ 里面,通常第二种类型被称为 reinterpret_cast,而第一种类型就直接使用显式类型转换实现。

在 Java 里面,通常也会根据上下文,出现 1 和 2 的两种不同情况。

猜你喜欢

转载自blog.csdn.net/alss1923/article/details/78889971