C99中float值1.0为何变为3.0?求技术解析
问题解释
首先看这段代码:
#include<stdio.h> int main() { float x = 1.0; int *p=(int *)&x; *p=1077936128; printf("x=%f, *p=%d\n",x,*p); }
你看到的结果是因为float类型遵循IEEE 754单精度浮点数标准,代码里通过int*直接修改了x的内存字节,把它改成了对应3.0的二进制表示。
具体拆解:
- 单精度float是32位,结构分为3部分:1位符号位、8位指数位、23位尾数位,计算值的公式是:
值 = (-1)^符号位 * (1 + 尾数) * 2^(指数 - 127) - 整数1077936128转换成十六进制是
0x40400000,对应的32位二进制是:0 10000000 10000000000000000000000- 符号位:0(表示正数)
- 指数位:
10000000,十进制是128,减去偏移量127后得1 - 尾数位:
10000000000000000000000,转换成小数是0.5(第一位对应2^-1)
- 代入公式计算:
(-1)^0 * (1 + 0.5) * 2^(1) = 1 * 1.5 * 2 = 3.0
另外要注意:这种通过不同类型指针访问同一块内存的操作属于类型双关,C标准里定义为未定义行为,只是在大多数遵循IEEE754的系统上会得到预期结果,不能保证在所有平台都有效。
内容的提问来源于stack exchange,提问作者dgdg
相关产品推荐
相关产品推荐

