1. 数值存储的本质差异
计算机用二进制存储所有数据,但整数和浮点数的处理方式截然不同。整数存储直观简单,32位系统下int类型直接对应4字节内存空间。比如数字42存储为:
code复制00000000 00000000 00000000 00101010
而浮点数采用IEEE 754标准,将32位空间划分为三部分:
- 符号位(1位)
- 指数位(8位)
- 尾数位(23位)
这种设计让浮点数能表示极大范围和极小数,但带来了精度问题。比如0.1在内存中实际存储为:
code复制00111101 11001100 11001100 11001101
关键区别:整数是精确存储,浮点数是近似存储。这是许多计算误差的根源。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 整型存储机制详解
2.1 原码与补码
早期计算机使用原码表示负数(最高位为符号位),但会导致+0和-0问题。现代系统统一采用补码:
- 正数:与原码相同
- 负数:绝对值取反加1
例如-42的存储过程:
- 42的二进制:00101010
- 取反:11010101
- 加1:11010110
2.2 溢出处理
当超过类型最大值时会发生"回绕"现象。比如8位无符号整数255加1会变成0。这是很多程序漏洞的根源。
3. 浮点存储的IEEE 754标准
3.1 科学计数法的二进制实现
浮点数采用类似科学计数法的结构:
code复制值 = (-1)^符号 × 1.尾数 × 2^(指数-127)
例如3.14的存储:
- 转为二进制:11.00100011110101110000101
- 规范化:1.100100011110101110000101 × 2^1
- 指数偏移:127 + 1 = 128 → 10000000
- 存储结果:
0 10000000 10010001111010111000010
3.2 特殊值处理
标准定义了特殊位模式表示:
- 无穷大(指数全1尾数全0)
- NaN(指数全1尾数非0)
- 非规格化数(指数全0)
4. 精度丢失的根源分析
4.1 十进制转二进制的固有误差
许多十进制小数无法精确表示为二进制分数。例如0.1在二进制中是无限循环:
code复制0.0001100110011001100
