#P8159. 【CSP第一轮】原码、反码和补码(ok)
【CSP第一轮】原码、反码和补码(ok)
以下是修复并优化排版后的文档内容,以及根据该文档编写的 10 道填空题(含详细题解)。
原码、反码与补码
机器数
与普通二进制数不同,机器数的最高位作为符号位:0 表示正数,1 表示负数;其余位表示数值的真值。
原码
原码的表示规则为:最高位表示符号,其余位表示绝对值。以 8 位二进制为例:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
反码
反码的表示规则如下:
- 正数的反码与其原码相同。
- 负数的反码是在其原码的基础上,符号位保持不变,其余各位按位取反。
[+1]原 = 0000 0001 → [+1]反 = 0000 0001
[-1]原 = 1000 0001 → [-1]反 = 1111 1110
补码
补码的表示规则如下:
- 正数的补码与其原码相同。
- 负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后在末位加
1(即在反码的基础上+1)。
[+1]原 = 0000 0001 → [+1]反 = 0000 0001 → [+1]补 = 0000 0001
[-1]原 = 1000 0001 → [-1]反 = 1111 1110 → [-1]补 = 1111 1111
为什么需要反码和补码?
既然原码最符合人类直觉,为何计算机还要引入反码和补码?核心原因在于简化硬件设计,将减法运算统一为加法运算,并让符号位参与计算。
-
原码的问题:减法变加法会出错
尝试用原码计算1 - 1(即1 + (-1)):0000 0001 (+1原) + 1000 0001 (-1原) = 1000 0010 (原) = -2结果显然错误。
-
反码的改进与遗留问题
使用反码计算1 + (-1):0000 0001 (+1反) + 1111 1110 (-1反) = 1111 1111 (反)将反码
1111 1111转回原码为1000 0000,表示-0。
虽然运算逻辑对了,但引入了+0(0000 0000) 和-0(1000 0000) 两个零,造成编码冗余。 -
补码的终极解决方案
补码彻底解决了-0的问题。在补码系统中,1000 0000不再表示-0,而是被规定为数值范围内的最小负数(即-128)。这样不仅消除了-0的冗余,还使可表示的数值范围多了一个数。- 8 位机器数表示范围:
-128 ~ 127 - 32 位机器数表示范围:
-2147483648 ~ 2147483647
- 8 位机器数表示范围:
课后巩固:填空题(共 10 题)
【题1】 在机器数中,最高位被用作符号位,规定 0 表示正数,1 表示 ______。
题解: 根据文档“机器数”部分,符号位 1 表示负数,0 表示正数。
答案: 负数
【题2】 对于正数而言,其原码、反码和补码三者的二进制表示是 ______ 的。
题解: 文档明确指出:“正数的反码就是其本身”、“正数的补码就是其本身”,因此三者完全相同。
答案: 完全相同(或相等)
【题3】 已知某负数的 8 位原码为 1010 1100,则其反码为 ______。
题解: 负数反码规则:符号位不变,其余位取反。1 保持不变,010 1100 取反得 101 0011,组合为 1101 0011。
答案: 1101 0011
【题4】 负数的补码是在其反码的基础上,末位 ______ 得到的。
题解: 文档补码定义:“负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1。(即在反码的基础上+1)”。
答案: 加 1(或 +1)
【题5】 计算机引入反码和补码的根本目的,是为了将 ______ 运算转换为 ______ 运算,从而简化 CPU 的算术逻辑单元设计。
题解: 文档“为什么需要反码和补码”第一段明确指出:“电脑计算减法是转换成加法进行计算”。
答案: 减法;加法
【题6】 使用反码计算 1 - 1 时,结果为反码 1111 1111,转换回原码后表示为 ______,导致了 +0 和该值共存的问题。
题解: 文档反码部分示例显示,1 + (-1) 反码相加得 1111 1111,对应原码 1000 0000,即 -0。
答案: -0(或负零)
【题7】 在 8 位补码系统中,二进制编码 1000 0000 被强制规定表示的十进制整数是 ______。
题解: 文档补码部分指出:“把 -0 的编码作为数字范围内的最小值”,8 位补码中 1000 0000 即代表 -128。
答案: -128
【题8】 8 位有符号整数采用补码表示时,其可表示的数值范围是 ______ 到 127。
题解: 文档末尾明确给出:“8位机器数能表示的数据范围:-128 ~ 127”。
答案: -128
【题9】 将十进制数 -5 转为 8 位补码时,先写出原码 1000 0101,取反得反码 1111 1010,再加 1 后得到的补码为 ______。
题解: 1111 1010 + 1 = 1111 1011。符合负数补码“反码末位加1”的规则。
答案: 1111 1011
【题10】 补码系统消除了 -0 的冗余编码,使得 n 位二进制补码能表示的整数总个数比原码(或反码)多 ______ 个。
题解: 原码/反码有 +0 和 -0 两个编码表示同一个数值,浪费了一个状态;补码将 100...0 规定为最小负数,因此多表示 1 个数。
答案: 1(或一)