数制编码与数据表示
计算机只能直接处理二进制,但业务世界有整数、小数、字符、图片和协议字段。理解数据表示,是理解溢出、乱码、序列化、网络协议和文件格式的基础。
# 1. 学习目标
- 理解二进制、十六进制、补码和浮点数的基本含义。
- 能解释字符编码和乱码产生的原因。
- 能在排查协议、文件和跨平台问题时识别数据表示差异。
# 2. 知识框架
数制编码与数据表示
├─ 入门:建立术语、对象和日常操作的直觉
├─ 进阶:理解机制、边界和跨平台差异
└─ 专家:能排障、能设计、能阅读实现和研究材料
数据表示的主线是:真实信息先编码成字节,字节按约定解释成数字、字符或结构。如果双方约定不一致,就会出现溢出、精度丢失或乱码。
# 3. 核心概念
| 主题 | 说明 | 工程关注 |
|---|---|---|
| 补码 | 有符号整数在计算机中的常见表示方式 | 整数溢出、位运算、边界值 |
| 浮点数 | 用符号位、指数和尾数近似表示小数 | 金额计算不能直接依赖浮点精确性 |
| 字符集 | 字符到码点和字节序列的映射规则 | UTF-8、GBK、UTF-16 转换 |
| 字节序 | 多字节数据在内存或网络中的排列顺序 | 网络协议、二进制文件、跨平台通信 |
# 4. 机制与实践
- 阅读二进制协议时先确认字段长度、字节序、字符集和对齐规则。
- 处理文本文件时显式指定 UTF-8,避免依赖系统默认编码。
- 金额和账务计算使用整数分或高精度十进制类型,而不是普通浮点数。
# 5. 常用命令与工具
| 命令或工具 | 作用 | 使用建议 |
|---|---|---|
xxd file.bin | 按十六进制查看文件内容 | 排查二进制协议和文件头时使用 |
file sample.txt | 识别文件类型和可能的编码 | 只能作为参考,不能替代协议约定 |
iconv -f GBK -t UTF-8 a.txt | 转换文本编码 | 迁移老系统文件时常用 |
# 6. 常见误区
- 把字符数量等同于字节数量:UTF-8 中一个中文通常占多个字节,截断字符串时可能破坏编码。
- 用浮点数处理金额:二进制浮点不能精确表示很多十进制小数。
- 忽略字节序:同一串字节在大端和小端解释下可能是完全不同的数字。
# 7. 进阶研究方向
- 阅读 IEEE 754 浮点标准的基本结构。
- 研究 UTF-8 为什么能够兼容 ASCII 并支持变长编码。
- 用十六进制工具观察 PNG、Class、ELF、PE 等文件头。
# 8. Tips 快问快答
Q:为什么会乱码?
A:写入时使用一种编码,读取时按另一种编码解释,同一组字节就会被映射成错误字符。
Q:为什么十六进制在系统领域常见?
A:十六进制每一位正好对应 4 个二进制位,表示字节和地址更紧凑。
Q:补码有什么好处?
A:补码让加减法可以用同一套硬件电路处理,同时只有一个零,边界规则也更统一。
# 9. 总结
数据表示决定了程序如何理解字节。掌握数制、补码、浮点、字符集和字节序后,很多看似诡异的溢出、乱码和协议问题都会变成可解释的问题。
上次更新: 2026/06/25, 10:02:19