为何这段C语言代码输出为0.000000而非预期的10.000000?
为什么这段C代码输出0.000000而非预期的10.000000?
先看你的代码:
#include<stdio.h> #include<stdlib.h> int main() { int i=10; void *ptr=&i; printf("%f",*(float *)ptr); return 0; }
问题出在这几个关键点:
int和float的二进制存储规则完全不一样
32位int类型的10,在内存里的二进制是00000000 00000000 00000000 00001010。但float采用IEEE 754单精度格式存储,由1位符号位、8位指数位、23位尾数位组成。你直接把int的二进制按float的规则解析,得到的是一个极小的非规格化数,打印时会被显示为0.000000。你搞错了类型转换的方式
当前代码是强制把int的地址转成float指针再解引用,这是直接读取内存二进制并按另一种类型解释,不属于数值转换。如果要得到10.0的float值,应该把int的数值转换成float类型,比如:printf("%f", (float)i);这种写法属于C标准里的未定义行为
C标准规定,用指向不兼容类型的指针访问对象(char指针除外)是未定义行为,编译器可能输出任何结果,这次输出0.0只是其中一种可能,换个平台或编译器结果可能完全不同。
内容的提问来源于stack exchange,提问作者Patel Sujal Vipul
相关产品推荐
相关产品推荐

