初级程序员考试

这是本文档旧的修订版!


202606162300

进制

进制数码基数位权
二进制(B)0,12$2^k$
八进制(O)0,1,2,3,4,5,6,78$8^k$
十进制(D)0,1,2,3,4,5,6,7,8,910$10^k$
十六进制(H)0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F16$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标准使用)

以 8位补码 计算 10 - 25 = -15 为例,走一遍完整的二进制演算过程:

第1步:找 +10 的补码

+10 是正数,补码 = 原码 = 00001010

第2步:找 -25 的补码(核心)

· +25 的原码:00011001

· 取反得反码:11100110

· 末位 +1 得补码:11100111(这就是 -25 的补码表示)

第3步:执行加法(CPU 实际做的事)

  00001010   (+10)
+ 11100111   (-25 的补码)
────────────
  11110001   (结果补码)

第4步:将结果补码转回十进制(验证)

· 结果 11110001,符号位为 1(负数)

· 末位 -1 得反码:11110000

· 取反得原码:10001111(符号位1不变,数值位 0001111 = 15)

· 所以结果是 -15 ✅

额外观察:溢出处理

这次计算中,最高位(第8位)没有产生进位,所以结果是正确的。

如果计算 125 + 125 = 250(超出127范围):

  01111101  (+125)
+ 01111101  (+125)
────────────
  11111010  (结果为 -6 ❌ 溢出错误)

符号位从 0 变成 1,产生了溢出,CPU 的溢出标志位(OF) 会置1提醒。

±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。

该主题尚不存在

您访问的页面并不存在。如果允许,您可以使用创建该页面按钮来创建它。

  • 初级程序员考试.1781625427.txt.gz
  • 最后更改: 2026/06/16 23:57
  • 张叶安