从十进制到二进制:深入理解定点数与浮点数表示
从十进制到二进制:深入理解定点数与浮点数表示
1. 十进制正整数与二进制正整数的“位权”概念
位权的本质:基数与幂次
十进制正整数与二进制正整数均采用位置计数法
十进制是以10为底的幂,逢10进1,其权的大小从低到高依次为:10º(1)、10¹(10)、10²(100) ......二进制是以2为底的幂,逢2进1,其权的大小从低到高依次为:2º(1)、2¹(2)、2²(4) ......
最终表示的数值的本质上是 “基数的幂次加权和” 。
大白话就是:每个数位上的数字与其对应的基数幂次(即“阶”)相乘后累加,得到最终的数值。
十进制示例:(13)₁₀
13 = 1 * 10¹ + 3 * 10⁰↑ ↑ ↑ ↑│ │ │ └── 个位:权重为 10⁰(1)│ │ └───── 数值 3│ └── 十位:权重为 10¹(10)└────── 数值 1
二进制示例:(1101)₂
1101 = 1 * 2³ + 1 * 2² + 0 * 2¹ + 1 * 2⁰ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ │ │ │ │ │ │ │ └── 最低位(LSB):权重 2⁰(1) │ │ │ │ │ │ └────── 数值 1│ │ │ │ │ └── 次低位:权重 2¹(2) │ │ │ │ └────── 数值 0│ │ │ └── 次高位:权重 2²(4)│ │ └────── 数值 1│ └── 最高位:权重 2³(8)└────── 数值 1
程序员视角:位权与数值范围
-
位权的隐含规则:
在编程中,数值的每一位权重由存储位置隐式定义。例如,一个8位二进制数(b0~b7编号)b7b6b5b4b3b2b1b0
的值为:b7*2⁷ + b6*2⁶ + ... + b0*2⁰
-
数值范围限制:
- n位十进制正整数范围:
0 ~ 10ⁿ - 1
- n位二进制正整数范围:
0 ~ 2ⁿ - 1
这种限制直接体现在数据类型中(如C语言的uint8_t
范围为0~255
)。
- n位十进制正整数范围:
1-1. 扩展:负整数的“阶”与补码表示
负整数的二进制表示需引入 符号位,但现代计算机采用 补码(Two’s Complement) 方案,使得加减法统一为加法操作。
补码的本质
- n位补码定义:
-x = 2ⁿ - x
例如,8位系统中-5
的补码为:256 - 5 = 251 → 11111011
- 符号位的权重:
补码的最高位既是符号位,也参与数值计算。
例如,8位补码10110111
的值为:-1*2⁷ + 0*2⁶ + 1*2⁵ + 1*2⁴ + 0*2³ + 1*2² + 1*2¹ + 1*2⁰ = -73
2. 十进制小数与二进制定点数
定点数格式
- 定点小数:固定小数点位置(如8位格式:
iii.fffff
) - 二进制小数转换:
(0.625)₁₀ = 0.5 + 0.125 = (0.101)₂
转换陷阱
- 精度丢失:
(0.1)₁₀ → (0.0001100110011...)₂
(无限循环)
3. 十进制与二进制定点数的转换
十进制小数转二进制步骤
-
整数部分:除2取余
-
小数部分:乘2取整
10.625 → 整数部分:10 → 1010 小数部分:0.625 × 2 = 1.25 → 取1 0.25 × 2 = 0.5 → 取0 0.5 × 2 = 1.0 → 取1 结果:1010.101
二进制转十进制
1010.101 → 8 + 2 + 0.5 + 0.125 = 10.625
4. 十进制科学计数法
标准形式
N = (-1)^s × M × 10^E
s
: 符号(0正1负)M
: 尾数(1 ≤ M < 10)E
: 阶码
示例:-123.45 → -1.2345 × 10²
5. 二进制科学计数法与IEEE 754浮点数
二进制规格化形式
N = (-1)^s × 1.M × 2^E
IEEE 754标准解析
单精度(32位)结构:
| 1位符号 | 8位阶码 | 23位尾数 |
关键特性:
-
阶码偏移:
实际指数 = 阶码 - 127
-
隐含前导1:尾数存储的是小数点后的部分
-
特殊值处理:
阶码全0
: 非规格化数(隐含0.xxx)阶码全1
: 无穷大/NaN
转换示例(单精度):
-5.75 →
-
二进制:
-101.11
-
规格化:
-1.0111 × 2²
-
编码:
- 符号位:1
- 阶码:2 + 127 = 129 →
10000001
- 尾数:0111000…(共23位)
总结与扩展
- 定点数适合硬件实现但范围有限
- IEEE 754通过科学计数法实现高动态范围
- 浮点数误差根源:二进制无法精确表示某些十进制小数
附:IEEE 754单精度内存布局示例
符号位 | 阶码(8位) | 尾数(23位)1 | 10000001 | 01110000000000000000000