1. 从"数字魔法"到内存存储的本质
第一次看到代码里那些奇怪的数字处理方式时,我完全懵了——为什么0.1+0.2不等于0.3?为什么整数有最大值限制?这些看似魔法的行为背后,其实是计算机内存存储的底层原理在起作用。今天我们就来彻底扒开这层神秘面纱。
计算机用二进制存储一切数据,但不同类型的数据有不同的存储规则。整数用补码表示,浮点数用IEEE 754标准,而像BigDecimal这样的类则是为了解决精度问题而生的特殊存储方式。理解这些存储机制,你就能明白代码中那些"魔法数字"的行为逻辑。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 整数的秘密:原码、反码与补码
2.1 为什么需要补码?
早期计算机使用原码表示数字,即最高位表示符号(0正1负),其余位表示数值。但这种表示法有个致命问题:0有两种表示形式(+0和-0),而且加减法运算复杂。
补码的出现完美解决了这些问题。在补码表示中:
- 正数的补码与原码相同
- 负数的补码是其原码取反后加1
- 0只有一种表示形式(全0)
这样设计的精妙之处在于,加减法可以统一用加法器实现,大大简化了CPU设计。
2.2 补码的实战应用
让我们用Java代码演示补码的特性:
java复制int max = Integer.MAX_VALUE; // 2147483647
int min = Integer.MIN_VALUE; // -2147483648
System.out.println(max + 1); // 输出-2147483648(溢出)
System.out.println(min - 1); // 输出2147483647(溢出)
这种溢出行为正是补码设计的直接结果。当超过最大值时,数值会"环绕"到最小值,反之亦然。
提示:在金融等对精度要求高的场景,应该使用BigInteger而不是基本类型int/long,以避免溢出问题。
3. 浮点数的魔法:IEEE 754标准解析
3.1 浮点数的内存结构
浮点数采用IEEE 754标准存储,以32位单精度浮点数为例:
- 1位符号位
- 8位指数位(阶码)
- 23位尾数位(有效数字)
这种设计类似于科学计数法,可以表示极大或极小的数字,但牺牲了绝对精度。
