1. 数据表示基础:从物理层到逻辑层
计算机内部所有信息最终都以二进制形式存在,这个看似简单的设计背后蕴含着深刻的工程智慧。电压的高低、磁极的方向、光盘的凹坑,这些物理状态被抽象为0和1的二进制世界。作为从业十余年的系统工程师,我见过太多因忽视数据表示基础而导致的诡异bug——从金融系统的金额计算错误到航天器的轨道偏差。
数值系统转换是每个程序员的基本功。上周我还帮团队新人排查一个十六进制与十进制混淆导致的协议解析错误。在实际工作中,最常用的是二进制(Binary)、十进制(Decimal)和十六进制(Hexadecimal)三种表示法。十六进制之所以重要,是因为它能以更紧凑的形式表示二进制数据,一个十六进制数字正好对应4位二进制(称为一个nibble)。
重要提示:调试内存数据时,建议始终以十六进制查看原始数据,可以避免二进制显示的冗长和十进制的不直观。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 整型数据的编码艺术
2.1 原码、反码与补码的演进史
早期计算机采用原码表示法,即最高位表示符号(0为正,1为负),其余位表示绝对值。这种方法直观但存在两个致命缺陷:零的表示不唯一(+0和-0),以及加减运算需要区分符号位。我在维护遗留系统时就遇到过因-0导致的比较逻辑错误。
反码通过将负数各位取反解决了零的唯一性问题,但加减运算仍然复杂。现代计算机普遍采用补码表示法,它的精妙之处在于:
- 统一了加减法运算
- 零的表示唯一
- 硬件实现简单
补码的转换有个实用技巧:从右往左找到第一个1,这个1及其右边的位保持不变,左边的位全部取反。例如-5的补码表示(8位):
原码:10000101 → 补码:11111011
2.2 整数范围与溢出防范
C语言中int类型的范围问题曾导致我团队一个电商项目出现严重的优惠券漏洞。不同字长下的整数范围必须牢记:
| 类型 | 32位范围 | 64位范围 |
|---|---|---|
| 有符号int | -2³¹ ~ 2³¹-1 | -2⁶³ ~ 2⁶³-1 |
| 无符号uint | 0 ~ 2³²-1 | 0 ~ 2⁶⁴ |
