====== 进制 ======
|进制|数码|基数|位权|
|二进制(B)|0,1|2|$2^k$|
|八进制(O)|0,1,2,3,4,5,6,7|8|$8^k$|
|十进制(D)|0,1,2,3,4,5,6,7,8,9|10|$10^k$|
|十六进制(H)|0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F|16|$16^k$|
位权:数字中每个位置对应的单位值。
====== 十进制与其他进制之间的转换 ======
1)其他进制转十进制
R进制数:$X_{m-1}··· X_{0} X_{-1}··· X_{-n} = \Sigma_{k=-n}^{k=m-1} X_{k} R^{k} $
例如二进制:$101.01=1 \times 2^2+1 \times 2^0+1 \times 2^{-2}=5.25$
2) 十进制转其他进制
|位置|整数部分:连除取余法| 小数部分:连乘取整法|
|表示|$N = (d_{m-1} \cdots d_1 d_0)_R$| $F = (0.d_{-1} d_{-2} \cdots d_{-n})_R$|
|d值|其中每一位由连续除以R的余数决定| 其中每一位由连续乘以R的整数部分决定|
|公式|$N_0 = N$ \\ $N_{i+1} = \lfloor N_i / R \rfloor \quad (i = 0,1,2,\cdots) $ \\ $d_i = N_i \bmod R \quad \text{(余数,取值范围 } 0 \sim R-1\text{)}$| $F_0 = F \quad \text{(纯小数部分)} $ \\ $F_{i+1} = \text{frac}(F_i \times R) \quad \text{(取小数部分继续)} $ \\ $d_{-i} = \lfloor F_i \times R \rfloor \quad \text{(乘积的整数部分,作为下一位)}$ |
|停止条件|当 $N_{i+1} = 0 $时停止,最后得到的余数 $d_{m-1}$ 作为最高位。|精确转换:当 F_{i+1} = 0 时停止(小数部分乘尽) \\ 近似转换:达到所需精度位数时停止(如保留 n 位小数)|
| 示例 |十进制 19 转二进制 (R=2) \\ 19 ÷ 2 = 9 余 1 $(d_0)$ \\ 9 ÷ 2 = 4 余 1 $(d_1)$ \\ 4 ÷ 2 = 2 余 0 $(d_2)$ \\ 2 ÷ 2 = 1 余 0 $(d_3)$ \\ 1 ÷ 2 = 0 余 1 $(d_4)$ 停止 \\ 结果: $(10011)_2$ | 十进制 0.625 转二进制 (R=2) \\ 0.625 × 2 = 1.25 → 整数部分 1 $(d_{-1})$,剩余 0.25 \\ 0.25 × 2 = 0.5 → 整数部分 0 $(d_{-2})$,剩余 0.5 \\ 0.5 × 2 = 1.0 → 整数部分 1 $(d_{-3})$,剩余 0.0 停止 \\ 结果: $(0.101)_2$ |
若数含整数部分 N 和小数部分 F,则:
$(N.F)_{10} = (N)_{10} \text{转} R \quad + \quad (0.F)_{10} \text{转} R$
两部分分别转换,最后用小数点拼接。
示例: 19.625 转二进制 = $(10011)_2 + (0.101)_2 = (10011.101)_2 $
特殊情况:无限循环
有些十进制小数无法精确转换成二进制(如 0.1),会形成循环:
$0.1_{10} = (0.000110011001100\cdots)_2 = (0.0\overline{0011})_2$
此时按精度要求截断即可。
====== 二、八、十六进制之间的转换 ======
^ 转换方向 ^ 方法 ^ 示例 ^
| 二进制 → 八进制 | 整数部分**从右往左**,小数部分**从左往右**,每 **3 位**一组,不足补 0, \\ 每组换 1 位八进制 | (10 111 101.010 1)₂ = (275.24)₈ |
| 八进制 → 二进制 | 每位八进制数展开成 **3 位**二进制(高位补 0) | (275.24)₈ = (010 111 101.010 100)₂ |
| 二进制 → 十六进制 | 整数部分**从右往左**,小数部分**从左往右**,每 **4 位**一组,不足补 0, \\ 每组换 1 位十六进制 | (1011 1101.0101)₂ = (BD.5)₁₆ |
| 十六进制 → 二进制 | 每位十六进制数展开成 **4 位**二进制(高位补 0) | (BD.5)₁₆ = (1011 1101.0101)₂ |
| 八进制 ↔ 十六进制 | **以二进制为桥梁**:八进制→二进制→十六进制(反之亦然) | (275)₈ → (010111101)₂ → (0BD)₁₆ = (BD)₁₆ |
====== 含符号数值的表示 ======
^ 码制 ^ 转换规则 ^ -25 ^ +25 ^ 特点 ^ 主要用途 ^
| 原码 | 符号位(最左一位):0正1负 \\ 数值位:真值的绝对值 | 10011001 | 00011001 | 0有+0和-0两种表示 | **人类直观理解**,\\ 用于输入输出显示,不参与运算 |
| 反码 | 正数:同原码 \\ 负数:符号位不变,数值位按位取反 | 11100110 | 00011001 | 0有两种表示,加减需循环进位 | **中间过渡桥梁** \\ 补码的中间步骤,现代计算机不用 |
| 补码 | 正数:同原码 \\ 负数:反码末位+1(符号位不变) | 11100111 | 00011001 | **计算机实际使用**,\\ 0唯一,减法统一为加法 | **整数运算核心** \\ CPU中的整数都用补码表示和计算 |
| 移码 | **补码符号位取反** \\ (数值位不变) | 01100111 | 10011001 | 便于浮点数阶码比较,0唯一 | **浮点数阶码** \\ 便于比较指数大小(IEEE 754标准使用) |
====== ±0的表示 ======
^ 码制 ^ +0 的表示 ^ -0 的表示 ^ 是否唯一 ^
| 原码 | 00000000 | 10000000 | 不唯一 ❌ |
| 反码 | 00000000 | 11111111 | 不唯一 ❌ |
| 补码 | 00000000 | 00000000 | 唯一 ✅ |
| 移码 | 10000000 | 10000000 | 唯一 ✅ |
====== 表示范围 ======
^ 码制 ^ 表示范围(8位) ^ 表示范围(n位) ^ 特殊说明 ^
| 原码 | $-(2^7 - 1) ~ +(2^7 - 1) $ \\ **-127 ~ +127** | $-(2^{n-1} - 1) ~ +(2^{n-1} - 1) $ | +0 和 -0 占两个编码,对称分布 |
| 反码 | $-(2^7 - 1) ~ +(2^7 - 1) $ \\ **-127 ~ +127** | $-(2^{n-1} - 1) ~ +(2^{n-1} - 1) $ | +0 和 -0 占两个编码,对称分布 |
| 补码 | $-2^7 ~ +(2^7 - 1) $ \\ **-128 ~ +127** | $-2^{n-1} ~ +(2^{n-1} - 1) $ | **多表示一个最小负数**(如 -128),0唯一 |
| 移码 | $-2^7 ~ +(2^7 - 1) $ \\ **-128 ~ +127** | $ -2^{n-1} ~ +(2^{n-1} - 1) $ | 0唯一,便于浮点数阶码比较 |
因为 补码和移码0唯一,没有100000000这个数,所以人为规定-128为100000000。
====== 浮点数的表示 ======
| |教学模型|IEEE 755标准|
|公式|$N=数符 * 尾数m * 2^{阶符*阶码e}$|$N = (-1)^S \times (1.M) \times 2^{E - bias}$|
|讲解|数符+、- \\ 尾数m 以0开头 \\ 阶符+、- \\ 阶码 即指数 |S = 数符(0正1负)\\ M = 尾数的小数部分(只存小数点后的位)\\ E = 存储指数(8位或11位无符号整数) \\ bias = 偏移量(单精度127,双精度1023)|
其中:
^ 原数 ^ 标准 ^ 数符(S) ^ 尾数(M) ^ 阶符 ^ 存储指数(E) ^ 完整二进制存储 ^
| $0.1011 \times 2^{011}$ | 教学模型 | +(存0)| 0.1011(存 `1011`)| +(存0)| 011(真实指数 3)| ``0 0 011 1011`` |
| $0.1011 \times 2^{011}$ | IEEE 754 | 0 | **1.011**(隐含前导1,存 `011`)| 无 | 10000010(3+127=130)| ``0 10000010 01100000000000000000000`` |
====== 浮点数加减运算过程 ======
对阶(小阶向大阶靠齐) -> 尾数计算 -> 结果格式化
计算:$0.101 \times 2^{001} + 0.110 \times 2^{011}$
第一步:对阶
第一个数指数是 001(1),第二个数指数是 011(3),阶差 = 3 - 1 = 2。
小阶向大阶靠齐,第一个数尾数右移 2 位:
0.101 >> 2 = 0.00101
对阶后:
$0.00101 × 2^{011}$
$0.110 × 2^{011}$
第二步:尾数相加
0.00101
+ 0.11000(补0对齐)
---------
0.11101
第三步:结果格式化
尾数 0.11101 整数位为 0,最高位为 1,已经是规格化纯小数,无需调整。
最终结果:$0.11101 × 2^{011}$
验证:
$0.101 × 2^1 = 0.625 × 2 = 1.25$
$0.110 × 2^3 = 0.75 × 8 = 6$
$1.25 + 6 = 7.25$
$0.11101 × 2^3 = 0.90625 × 8 = 7.25 $
====== 浮点数转二进制(存疑) ======
转分数形式 -> 分子转二进制 -> 分子部分尾数右移 -> 添加符号位 -> 补足位数
计算:-13.625
第一步:转分数形式
13.625 = 109/8
分子:109,分母:8(分母为 2^n)
第二步:分子转二进制
109 ÷ 2 = 54 余 1
54 ÷ 2 = 27 余 0
27 ÷ 2 = 13 余 1
13 ÷ 2 = 6 余 1
6 ÷ 2 = 3 余 0
3 ÷ 2 = 1 余 1
1 ÷ 2 = 0 余 1
109₁₀ = 1101101₂
第三步:除以分母(右移 n 位)
分母 8 = 2³,分子右移 3 位
1101101₂ 右移 3 位 = 1101.101₂
规格化成教学模型格式(尾数为纯小数):
1101.101 = 0.1101101 × 2⁴
第四步:填入教学模型公式 N = 数符 × 尾数 × 2^{阶符 × 阶码}
数符:-(负号)
尾数:0.1101101
阶符:+(指数为正)
阶码:100(指数为4)
第五步:补足位数(假设8位存储:1位数符 + 1位阶符 + 3位阶码 + 3位尾数)
数符:1(负)
阶符:0(正)
阶码:100
尾数:110(只存小数部分,截断到3位)
完整存储:1 0 100 110
====== 逻辑运算规则 ======
* 逻辑或()