文章

【GESP】C++三级考试大纲知识点梳理, (1)二进制数据编码

GESP C++三级官方考试大纲中,共有8条考点,本文针对C++(1)号知识点进行总结梳理。

(1)了解二进制数据编码:原码、反码、补码。

一、什么是计算机数据编码?

计算机数据编码是指将数据按照特定的规则转换为计算机能够识别和处理的二进制形式(由0和1组成的代码)。这种编码方式是计算机用来存储、处理和传输各种类型信息(如数字、文字、图像、声音等)的基础。

计算机中的所有数据,无论是输入、存储、处理还是输出,最终都以二进制编码的形式存在。数据编码的目标是用有限的符号(0和1)高效、准确地表达真实世界中的信息。

二、计算机为什么要采用二进制

计算机采用二进制的原因可以从技术、经济和逻辑的多个方面进行解释。以下是详细的分析:

1. 硬件实现简单

1.1 物理实现

  • 二进制的每一位只有两种状态:01,与物理器件的两种稳定状态(如高电平和低电平、通电和断电、磁化和未磁化)完全匹配。
  • 使用二进制,硬件电路(如晶体管)的设计变得简单且可靠,不需要区分多种复杂的电压或状态。

1.2 噪声容忍度

  • 在多进制系统(如十进制)中,不同状态之间的电压差很小,容易受到噪声干扰。
  • 二进制只有两个状态,电压差距大,噪声影响更小,信号的稳定性和准确性更高。

2. 逻辑运算简单

2.1 布尔代数支持

  • 二进制直接对应布尔代数,后者是计算机逻辑的基础。
    • AND(与)、OR(或)、NOT(非) 等逻辑运算非常容易用硬件电路实现。
    • 逻辑门(如与门、或门)设计和制造简单。

2.2 算法效率

  • 二进制在加减乘除运算中的算法逻辑非常清晰,特别是移位操作(如乘以2或除以2)只需简单的位移运算。
  • 计算机的底层操作基于二进制的加法器和逻辑运算,效率极高。

3. 存储和传输便捷

3.1 存储单元

  • 二进制只需要两个状态,适用于计算机存储器(如磁盘、闪存)中使用磁极方向、电荷状态等物理特性来存储信息。

3.2 信息传输

  • 在传输数据时,二进制信号(高电平/低电平)抗干扰能力强,不易出错。
  • 数据的校验和纠错机制(如奇偶校验)在二进制系统中容易实现。

4. 成本低

  • 多进制系统: 如果采用十进制或其他进制,需要设计支持多状态的硬件,例如每个存储单元必须能精确区分10种电压水平,这会显著增加硬件成本和复杂性。
  • 二进制系统: 只需区分两种状态,硬件制造简单,成本更低,可靠性更高。

小结

计算机采用二进制主要因为它在硬件实现、逻辑运算、存储传输、成本效益以及系统稳定性等方面具有无可替代的优势。虽然其他进制(如三进制、十进制)在理论上也可以实现,但二进制的简单性和高可靠性,使其成为计算机发展的最优选择。

三、了解二进制数据编码:原码、反码、补码

计算机内部的所有数据最终都以二进制形式存储。为了表示正数和负数,并进行有效的算术运算,计算机科学家引入了原码、反码和补码的概念。

1. 原码 (Original Code)

原码是最直观的表示方法。将一个整数转换成二进制形式,其中最高位作为符号位:0表示正数,1表示负数,其余位表示数值的绝对值。

示例(8位二进制):

  • [+5]原 = 0000 0101
  • [-5]原 = 1000 0101

缺点:

  • 零的表示不唯一: [+0]原 = 0000 0000,[-0]原 = 1000 0000。这会带来歧义。
  • 进行加减运算复杂: 当两个异号数相加或同号数相减时,需要额外的逻辑判断,增加了硬件的复杂性。例如,计算 5 + (-5),用原码直接相加会得到 1000 1010 (-10),结果错误。

2. 反码 (Inverse Code)

反码是在原码的基础上对负数的数值部分取反(0变1,1变0),正数保持不变。

  • 正数: 反码与原码相同。
  • 负数: 符号位不变(仍然是1),其余位按位取反(0变1,1变0)。

示例(8位二进制):

  • [+5]反 = 0000 0101
  • [-5]反 = 1111 1010

解决的问题: 反码部分地解决了原码进行减法运算的问题。例如,计算 5 + (-5),用反码相加:0000 0101 + 1111 1010 = 1111 1111。如果将 1111 1111 视为反码,转换成原码为 1000 0000,即 -0。虽然结果仍然存在正负零的问题,但在一定程度上简化了运算。

仍然存在的问题: 零的表示仍然不唯一。

3. 补码 (Complement Code)

补码是在反码的基础上加1,用于统一正负数的编码方式,便于运算。

  • 正数: 补码与原码相同。
  • 负数: 在其反码的基础上加1。

示例(8位二进制):

  • [+5]补 = 0000 0101
  • [-5]补 = 1111 1011

优点:

  • 零的表示唯一: [-0]补 和 [+0]补 都是 0000 0000。
  • 简化了加减法运算: 使用补码,可以将减法运算转换为加法运算,简化了硬件设计。例如,计算 5 + (-5),用补码相加:0000 0101 + 1111 1011 = 0000 0000(最高位的溢出位被丢弃)。结果正确。
  • 多表示一个负数: 对于 8 位二进制数,使用原码和反码表示的范围是 [-127, +127],而使用补码表示的范围是 [-128, +127]。这是因为 1000 0000 在补码中被用来表示 -128。

4. 小结

编码方式正数负数零的表示优点缺点
原码自身符号位为1,其余为绝对值不唯一直观易懂零的表示不唯一,加减运算复杂
反码自身符号位不变,其余位取反不唯一简化了减法运算零的表示不唯一
补码自身反码加1唯一简化了加减法运算,零的表示唯一,多表示一个负数人脑不容易直观看出数值

5. 为什么计算机采用补码编码?

补码在现代计算机中是主流的编码方式,其被广泛采用的原因包括以下几个方面:

1. 运算简化

  • 在补码中,加法和减法可以统一为加法,硬件不需要额外的减法逻辑。
    • 例如:计算 (A - B) 等价于 (A + (-B)),而 (-B) 的补码形式直接解决了这一问题。
  • 加法器设计简单,提高了硬件效率。

2. 消除“符号位”问题

  • 原码和反码都需要特殊处理符号位,导致运算复杂,而补码将符号位直接融入数值表示中,避免额外操作。

3. 唯一的零

  • 补码表示中,只有一个零 (0000),消除了原码和反码中“正零”和“负零”共存的冗余问题。

4. 更大的表示范围

  • 补码能多表示一个最小负数。例如,4位补码中可以表示 (-8) (1000),而原码和反码只能表示到 (-7)。

5. 适合硬件实现

  • 补码的编码方式天然符合二进制的进位与溢出特性,使计算机硬件在加法运算和逻辑移位操作中高效运行。

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

本文由作者按照 CC BY 4.0 进行授权