float和int虽同占4字节,但存储结构本质不同:int为32位补码整数,float为ieee 754单精度(1位符号+8位指数+23位尾数);强转按语义 reinterpret,非直接位拷贝,故0x40490fdb 对 int 是1078530075,对 float 是3.14。

Java中float和int虽然都占4个字节,但不能互换存储结构,强转不是“直接 reinterpret bits”,而是按语义重新解释数值——这是辨析的关键。
float与int的4字节本质不同
int是纯二进制补码整数,所有32位都用于表示有符号整数值;float则遵循IEEE 754单精度标准:1位符号位 + 8位指数位 + 23位尾数位。相同bit模式(如0x40490FDB)对int是十进制1078530075,对float却是3.14——二者解读规则完全不同。
float → int强转:截断而非四舍五入
执行(int)3.9f时,JVM不直接丢弃小数位,而是先将float值按IEEE 754规则解析为真实十进制近似值(如3.8999998),再向零截断得3。该过程涉及浮点解码→实数逼近→整数截断三步,不是简单取前32位。
- 负数同样向零截断:(int)(-3.9f) → -3,不是-4
- 超出int范围(±2³¹)时结果未定义:(int)3.5E10f → -1241513984(溢出后补码回绕)
int → float强转:可能丢失精度
int转float属自动提升,但并非无损。float仅能精确表示24位有效数字,而int有32位。当int绝对值超过2²⁴(约1677万)时,连续整数在float中会合并:
- 16777215 → float后仍精确等于自身
- 16777216 → float后仍精确
- 16777217 → 转float后变成16777216(最低位被舍入掉)
这是因为float尾数只有23位显式存储,加上隐含的1位,共24位精度;超过此范围的整数无法被唯一表示。
验证方式:用Integer.floatToIntBits()与Float.floatToIntBits()
可通过位操作直观对比:
- Float.floatToIntBits(3.14f) 返回0x40490FDB(float的bit pattern)
- Integer.valueOf(3).intValue() 对应0x00000003(int的bit pattern)
- 二者十六进制完全不同,证明底层存储逻辑分离
强行用Unsafe或ByteBuffer做raw bit copy,得到的int值毫无数学意义——这正是“类型语义优先于字节布局”的体现。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











