数据的表示
一、总论:数据表示的第一性原理
计算机中的一切数据表示,本质上都是在硬件约束下,对现实世界信息所做的工程近似。
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) 涉及数据校验相关内容,与本文可靠性设计部分相关