(1)double a1=22.32;
int b1=(int)a1;
(2)double a2=2.5e20;
int b2=(int)a2;
按照浮点数到整数的转换语义,结果应该截去浮点数的小数部分,而保留整数部分。所以b1应该为22,而b2则超出了其能表示的范围。这是值的截断
基本数据类型直接的指针转换一般来说必将造成内存截断或内存访问范围的扩展,除非两种类型具有相同的字节大小。虽然相同字节大小的类型之间不会造成内存截断或访问范围扩张,但是指针类型之间的转换改变了编译器对指针所指向内存单元的解释方式,因此,结果也必然出问题。
(3)double a3=1234.77;
int * pInt=(int *)&a3;
(4)int a4=100;
double *pDbl=(double *)&a4;
在(3)中将一个double型的指针强制转换成一个int型指针,pInt访问的范围变小了(内存截断),a3有8字节内容,但是pInt只能访问a3的前4个字节,并将这四个字节的数据解释成一个int型数据,这个数是不可预料的。
在(4)中将一个int型指针转换成一个double型指针,pDbl指向的范围不再是4字节,而是8字节(内存扩张),当你向pDbl中写数据时会产生运行时错误。