为何int与float的指针和变量类型转换结果不一致?
问题:指针类型转换为何无法得到与变量类型转换一致的结果?
在以下程序中,执行了int指针与float指针之间的类型转换,但输出结果不符合预期:
#include <stdio.h> int main() { int a, *ptr_i, *ptr_xi; float f, *ptr_f, *ptr_xf; a = 65; f = 65.5; ptr_i = &a; ptr_f = &f; ptr_xi = ptr_i; ptr_xf = ptr_f; ptr_f = (float*) ptr_xi; ptr_i = (int*) ptr_xf; printf("The value of \"ptr_i\" is %d\n", *ptr_i); printf("The value of \"ptr_f\" is %f\n", *ptr_f); return 0; }
输出结果:
The value of "ptr_i" is 1115881472
The value of "ptr_f" is 0.000000
而此类类型转换在普通变量上是可行的,示例程序如下:
#include <stdio.h> int main() { int a, i; float b, f; a = 65; b = 65.5; f = (float) a; i = (int) b; printf("The value of 'i' is %d\n", i); printf("The value of 'f' is %.2f\n", f); return 0; }
输出结果:
The value of 'i' is 65
The value of 'f' is 65.00
请问为何对指针进行类型转换时,无法得到与变量类型转换一致的正确结果?
解答
核心区别在于:普通变量的类型转换是「值的转换」,而指针的类型转换是「内存解读方式的转换」,二者本质完全不同:
1. 普通变量的类型转换:生成新的符合目标类型的值
当你执行f = (float)a或者i = (int)b时:
(float)a是把整数65的数值,按照IEEE754浮点数编码规则,转换成float类型对应的二进制值(0x42800000),然后赋值给f,相当于生成了一个新的、符合float类型规则的数据。(int)b是把浮点数65.5的小数部分截断,提取出整数部分65,生成新的int类型值赋值给i。
这种转换是基于数值语义的转换,最终得到的是符合目标类型逻辑的值。
2. 指针类型转换:只是改变编译器对内存的解读规则
当你执行ptr_f = (float*)ptr_xi或者ptr_i = (int*)ptr_xf时:
ptr_f = (float*)ptr_xi:并没有改变变量a所在内存的二进制数据(a=65的二进制是0x00000041,32位系统),只是告诉编译器:现在把这块内存的内容,按照float类型的编码规则去解读。但0x00000041作为float值是一个极小的非规格化数,接近0,所以printf输出0.000000。ptr_i = (int*)ptr_xf:同样没有改变变量f所在内存的二进制数据(f=65.5的二进制是0x42810000),只是让编译器把这块内存的二进制当成int类型来读,0x42810000转换成十进制就是1115881472,也就是你看到的输出。
简单说:指针转换不会修改内存里的任何数据,只是换了一种“读”的方式;而变量转换是生成了新的、符合目标类型的数据。
内容的提问来源于stack exchange,提问作者Debojit
相关产品推荐
相关产品推荐

