1.隐形转换
所谓隐形转换,就是编译器在背后帮程序员做的类型转换工作,程序员往往察觉不到。既然是编译器自动进行,那么这种类型转换都具有足够的安全性,这都是编译器的责任。
这里我们提及到的安全性主要由两个方面:内存单元访问的安全性和转换结果的安全性。主要表现为内存访问范围的扩张、内存的截断、尾数的截断、值的改变和溢出等。
注:
一个低级数据类型对象总是优先转换成能容纳得它的最大值在、占用内存最小单元的类型。
2.强制转换
我们首先来看如下代码:
double d3=1.55e+20;
double d4 = 11.2;
int i = (int)d3;
int j = (int)d4;
按照浮点数到整数的转换定义,我们会截取浮点数的小数位而取其整数位,因此j今天得到11,而i会发生溢出现象,因为d3的整数部位远远超出了int类型的取值范围。
基本类型的数据转换一般来说都是会造成内存截断或者内存访问范围的扩张,除非是相同字节的类型转换,但仍旧会改变编译器对指针所指向的内存单元的解释方式。
让我们来看如下代码:
double d1 = 952.25;
int *p=(int*)&d1;
int sum=10;
double*p1=(double*)∑
对于这两类强制转换我们可以通过画图来观察:
通过此图我们发现,通过p访问指向的double类型是安全的,后面的四个字节的被”截断“了,但我们通过p的值是多少呢?会是我们想要的952吗?答案是否,我们所得到的是d1开头的4个字节中的内容。
我们使用p1来访问sum时,会发现访问内存范围中的“扩张”,如果写入数据可能会发生错误。