一、对指针进行强制类型转换
1.1printf打印时的转换形式
代码语言:javascript复制int main()
{
int a = 5;
printf("%lf", a);
return 0;
}
解释代码: 这样的代码虽然能编译的过去,但其实是有不妥当的地方的,但平常我们在做题的时候难免遇到这样的代码风格,所以我们在这里解释一下这样的代码,但希望大家还是不要写出这样的代码来,这样的代码风格其实是不好的
其实我们先创建了一个大小为5的一个整型变量,并且这个变量以二进制的形式存储到栈区里面,占据了32个比特位,然后我们就进行打印了,但我们却以双精度浮点数的形式打印这个整型数字5,此时5的二进制代码已经存储到内存里面了,是没有进行改变的,所以存储形式是不会变得,而我们现在却改变了读取方式,我们用双精度的形式来读取这个二进制代码,分别读取他的符号位,指数位,有效位,所以我们打印出来的数,其实就是用读取浮点型的方法来读出整型5的二进制代码,然后进行结果的打印(如果这里不清楚浮点型的读取方法的话,可以去看我之前的博客,整形的存储)
1.2用指针操作符的转换形式
代码语言:javascript复制int a = 1234567890;
float *f = (float *)&a;
printf("%f", *f);
代码解释: 这样的代码风格是值得表扬的,我们都应该写出这样高质量的代码。
先把整型数字a的二进制代码放到内存里面,然后我们现在拿出这个整型变量a的地址,并将其进行修改为单精度浮点数的地址形式,然后我们把这个修改后的地址放到浮点型指针变量f里面去,最后我们对变量f进行解引用操作,其实就是将a的二进制代码按照浮点型的形式拿出来,然后进行打印,如果你想要知道这个打印的结果的话,你必须写出来他的二进制代码,然后将其按照浮点型中表示方法的对应比特位的个数拿出来,最后进行结果读取
1.3总结
这两种代码其实表达的内涵意思是相同的,他们是没有改变内存中变量的存储形式的,改变的是其读取方式,而且第二段的代码风格大家要学习,尽量写出这样的代码来。
这时有人可能会问到了,那既然两段代码表达的意思相同而且第二段代码的风格还比较好,那博主你还介绍第一段代码干什么呀,直接给我们讲哪个最好的代码不就得了吗???而且还列举个代码风格不好的代码,你这是何必呢?
其实答案很简单嘛,你做题总会遇到形形色色的代码,我不得给你介绍全面?要不然你肯定会想,那个笨笨的博主没有讲清楚这个知识点呀!不能你做不出来题,或者因为代码风格不好,你就不做这题了吧