差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
| 初级程序员考试 [2026/06/16 23:25] – [含符号数值的表示] 张叶安 | 初级程序员考试 [2026/06/17 00:02] (当前版本) – 张叶安 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| 202606162300 | 202606162300 | ||
| + | |||
| + | 120节,一天4节,30天看完。 | ||
| ====== 进制 ====== | ====== 进制 ====== | ||
| 行 54: | 行 56: | ||
| ====== 含符号数值的表示 ====== | ====== 含符号数值的表示 ====== | ||
| + | ^ 码制 ^ 转换规则 ^ -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 | ||
| + | + 11100111 | ||
| + | ──────────── | ||
| + | 11110001 | ||
| + | </ | ||
| + | |||
| + | 第4步:将结果补码转回十进制(验证) | ||
| + | |||
| + | · 结果 11110001,符号位为 1(负数) | ||
| + | |||
| + | · 末位 -1 得反码:11110000 | ||
| + | |||
| + | · 取反得原码:10001111(符号位1不变,数值位 0001111 = 15) | ||
| + | |||
| + | · 所以结果是 -15 ✅ | ||
| + | |||
| + | 额外观察:溢出处理 | ||
| + | |||
| + | 这次计算中,最高位(第8位)没有产生进位,所以结果是正确的。 | ||
| + | |||
| + | 如果计算 125 + 125 = 250(超出127范围): | ||
| + | |||
| + | < | ||
| + | 01111101 | ||
| + | + 01111101 | ||
| + | ──────────── | ||
| + | 11111010 | ||
| + | </ | ||
| + | |||
| + | 符号位从 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^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。 | ||
| + | |||
| + | |||
| - | ^ 码制 ^ 转换规则(以8位为例,真值 N) ^ 示例(N = -25) ^ 特点 ^ 主要用途 ^ | ||
| - | | 原码 | 符号位:0正1负 \\ 数值位:真值的绝对值 | 符号位1,数值位011001 → **10011001** | 0有+0和-0两种表示 | **人类直观理解**,用于输入输出显示,不参与运算 | | ||
| - | | 反码 | 正数:同原码 \\ 负数:符号位不变,数值位按位取反 | 原码10011001 → 符号位1不变,数值位0011001取反得1100110 → **11100110** | 0有两种表示,加减需循环进位 | **中间过渡桥梁**,补码的中间步骤,现代计算机不用 | | ||
| - | | 补码 | 正数:同原码 \\ 负数:反码末位+1(符号位不变) | 反码11100110 + 1 → **11100111** | **计算机实际使用**,0唯一,减法统一为加法 | **整数运算核心**,CPU中的整数都用补码表示和计算 | | ||
| - | | 移码 | **补码符号位取反** \\ (数值位不变) | 补码11100111 → 符号位1变0 → **01100111** | 便于浮点数阶码比较,0唯一 | **浮点数阶码**,便于比较指数大小(IEEE 754标准使用) | | ||