本文源自某乎 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 的两种不同情况