#P8180. 类型综合

类型综合

以下是修复并优化排版后的文档内容,以及根据该文档编写的 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 + (-1)):

    0000 0001 (+1原) + 1000 0001 (-1原) = 1000 0010 (原) = -2
    

    结果显然错误。

  2. 反码的改进与遗留问题
    使用反码计算 1 + (-1)

    0000 0001 (+1反) + 1111 1110 (-1反) = 1111 1111 (反)
    

    将反码 1111 1111 转回原码为 1000 0000,表示 -0
    虽然运算逻辑对了,但引入了 +0 (0000 0000) 和 -0 (1000 0000) 两个零,造成编码冗余。

  3. 补码的终极解决方案
    补码彻底解决了 -0 的问题。在补码系统中,1000 0000 不再表示 -0,而是被规定为数值范围内的最小负数(即 -128)。这样不仅消除了 -0 的冗余,还使可表示的数值范围多了一个数。

    • 8 位机器数表示范围-128 ~ 127
    • 32 位机器数表示范围-2147483648 ~ 2147483647

课后巩固:填空题(共 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(或一)