You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 01:25:23