数据的表示
一、总论:数据表示的第一性原理
计算机中的一切数据表示,本质上都是在硬件约束下,对现实世界信息所做的工程近似。
1. 硬件的三大根本约束
离散性(Discrete)
计算机只能处理有限位宽的二进制状态(0 / 1),无法直接表示连续无限的实数。
统一性(Uniformity)
数据的表示方式必须与运算电路匹配,否则会导致逻辑复杂、成本上升。
可预测性(Predictability)
所有误差、溢出、舍入都必须是可分析、可界定、可复现的。
后续所有整数、浮点、字符、校验机制,都是在这三条约束下的不同工程解法。
二、数值表示(一):整数的表示哲学
1. 问题本质
如何在有限位宽内,同时表示正负、大小,并统一运算规则?
这是整数表示的核心矛盾。
2. 表示方式的演化逻辑(而非并列记忆)
| 表示方式 |
设计动机 |
根本缺陷 |
| 原码 |
直观区分正负 |
+0 / -0,运算不统一 |
| 反码 |
尝试统一加法 |
仍存在双零 |
| 补码 |
统一表示与运算 |
表示范围不对称(可接受) |
3. 补码的设计本质
补码并不是"技巧",而是电路友好型设计:
- 符号位不再是"特殊位",而是数值的一部分
- 加法器无需区分正负
- 减法可转化为加法
数学解释(n 位补码):
[
\mathsf{B2T}n(x) = -x{n-1} \times 2^{n-1} + \sum_{i=0}^{n-2} x_i \times 2^i
]
结论:补码的价值不在表示,而在运算统一性。
4. 移码(偏置表示)
- 本质:对补码最高位取反
- 目的:将有符号数映射为无符号空间
- 典型用途:浮点数阶码
三、数值表示(二):浮点数的工程近似模型
1. 浮点数不是"精确数"
| 层次 |
描述 |
| 数学 |
实数是连续、无限的 |
| 计算 |
浮点数是离散的科学计数法 |
| 工程 |
精度有限,误差必然 |
浮点数的设计目标不是"准确",而是可预测误差。
2. 统一模型
[
Value = (-1)^S \times M \times 2^E
]
- **S(符号位)**:决定正负
- **E(偏置阶码)**:决定表示范围
- **M(尾数)**:决定有效精度
阶码决定"能有多大/多小",尾数决定"有多准"。
3. IEEE 754:工程权衡的产物
| 类型 |
阶码 |
尾数 |
特点 |
| 单精度 |
8 位 |
23 位 |
性能优先 |
| 双精度 |
11 位 |
52 位 |
精度优先 |
设计哲学:
4. 浮点加法与精度丢失
核心原因:
当两个数的量级差超过尾数位数时,小数将被直接舍弃。
工程补救方案:
- Kahan Summation:记录并补偿舍入误差
本质:误差管理,而非消除误差。
四、符号表示:字符编码的统一抽象
1. 字符编码的本质模型
字符编码系统 = 字符集 × 编码规则 × 存储/传输假设
2. 编码体系的演进逻辑
| 编码 |
设计背景 |
核心特征 |
| ASCII |
英文世界 |
7 bit |
| GB2312 / GBK |
中文扩展 |
双字节 |
| UTF-16 |
内存友好 |
定长代码单元 |
| UTF-8 |
网络友好 |
变长、自同步 |
3. UTF-8 vs UTF-16 的本质差异
| 维度 |
UTF-8 |
UTF-16 |
| 存储 |
变长 |
相对定长 |
| 容错 |
强(自同步) |
弱 |
| 网络 |
友好 |
不友好 |
| 内存 |
一般 |
高效 |
选择编码,本质是场景权衡。
五、可靠性设计:数据校验与纠错
1. 第一性原理
错误不可避免,只能被检测与控制。
核心手段:增加冗余,扩大码距。
2. 码距与能力边界
- 码距 ≥ e + 1:可检测 e 位错误
- 码距 ≥ 2t + 1:可纠正 t 位错误
3. 校验机制的系统选型视角
| 场景 |
错误模型 |
典型方案 |
| 内存 |
单比特错误 |
海明码 |
| 网络 |
突发错误 |
CRC |
| 简单设备 |
随机错误 |
奇偶校验 |
校验方案不是算法选择,而是系统风险管理决策。
六、全局总结:统一认知框架
数据表示
├── 第一性原理
│ ├── 离散性
│ ├── 统一性
│ └── 可预测性
├── 数值表示
│ ├── 整数(补码)
│ └── 浮点(IEEE 754)
├── 符号表示
│ └── 字符编码
└── 可靠性
└── 校验与纠错
所有具体规则,都是工程权衡的结果,而非偶然设计。
关联内容(自动生成)
- [/计算机系统/程序结构和执行/运算方法与运算器.html](/计算机系统/程序结构和执行/运算方法与运算器.html) 详细介绍了补码运算、浮点数运算等运算方法,与本文的数值表示内容密切相关
- [/计算机系统/程序结构和执行/汇编.html](/计算机系统/程序结构和执行/汇编.html) 涉及浮点数在汇编层面的运算实现,包括浮点数加减乘除等操作
- [/编程语言/JAVA/语言基础.html](/编程语言/JAVA/语言基础.html) 讨论了Java中浮点数误差的本质,遵循IEEE 754标准,与本文浮点数表示内容相关
- [/编程语言/JAVA/Java谜题.html](/编程语言/JAVA/Java谜题.html) 涉及浮点数模型和IEEE754标准,以及浮点数在实际编程中的问题
- [/DSL/SQL.html](/DSL/SQL.html) 包含SQL中浮点数类型的定义和使用,与数据表示中的数值表示相关
- [/中间件/数据库/数据类型.html](/中间件/数据库/数据类型.html) 讨论了数据库中的数据类型,包括浮点数类型,与本文数值表示内容相关
- [/计算机网络/应用层.html](/计算机网络/应用层.html) 涉及数据表示在网络协议中的应用,包括文本、二进制、结构化格式等
- [/计算机网络/链路层.html](/计算机网络/链路层.html) 提到CRC校验码的使用,与本文数据校验部分相关
- [/操作系统/输入输出.html](/操作系统/输入输出.html) 涉及数据校验机制,与本文可靠性设计部分相关
- [/计算机系统/数字逻辑电路.html](/计算机系统/数字逻辑电路.html) 涉及补码运算,与本文整数表示部分相关
- [/中间件/数据库/redis/集群.html](/中间件/数据库/redis/集群.html) 使用CRC16算法进行键值分布,与本文数据校验部分相关
- [/中间件/数据库/索引.html](/中间件/数据库/索引.html) 使用CRC32进行数据校验,与本文数据校验部分相关
- [/编程语言/JavaScript/JavaScript.html](/编程语言/JavaScript/JavaScript.html) 提到JavaScript使用IEEE-754双精度浮点数,与本文浮点数表示相关
- [/计算机网络/rpc.html](/计算机网络/rpc.html) 涉及数据表示层,讨论如何描述与演化数据,与本文数据表示主题相关
- [/数据技术/数据治理.html](/数据技术/数据治理.html) 涉及数据校验相关内容,与本文可靠性设计部分相关