在c语言中,强制类型转换可以分为两种类型
1.对指针进行强制类型转换
int a = 1234567890;
float *f = (float *)&a;
printf("%f", *f);
2.对变量直接进行强制类型转换
int a = 1234567890;
float f = (float)a;
printf("%f", f);
这两种转换对于编译器来说有什么区别?
直接对变量进行类型强制转换时,编译器会
1)先将a的值1234567890当成整型数处理
2)然后将其按照浮点数的格式存储在内存中,可以看成当成1234567890.0,但是其在内存中存储的值已经被改变,现在内存中的值可以根据浮点数表示方法去进行计算;
3)最后将此值按照浮点数通过printf显示出来,即看到的1112539136.000000;
但是如果第一段代码中的方式,即:
1)先将保存整型数的地址转换成浮点数类型的地址,因为只对地址进行了类型转换,内存地址内保存的内容就仍然保持不变,仍然为1234567890;
2)然后编译器就会按照浮点数的存储格式解释内存值1234567890,其值恰好为1228890.250000;
3)最后通过printf将上述值显示出来;
【总结】:直接对数据进行强制转换时,会改变数据在内存中的存储格式,尤其浮点类型和整型数据之间的转换;