Skip to main content

第20章 数据编码

在计算机中,数值是以二进制形式存储的,而原码、反码、补码是表示有符号整数的三种编码方式。它们的设计目的是解决计算机中负数的表示和运算问题,尤其是如何通过加法运算实现减法操作。本章将详细介绍这三种编码的定义、表示方法、转换规则及实际应用。

20.1 机器数与真值

机器数:一个数在计算机中的二进制表示形式,包含符号位和数值位。通常用最高位表示符号(0表示正数,1表示负数),其余位表示数值的绝对值。例如,8位二进制数0000010110000101都是机器数。

真值:机器数所对应的实际数值。例如,机器数00000101的真值是+5,10000101的真值是-5。

20.2 原码(True Form)

20.2.1 定义

  • 正数:符号位为0,数值位为该数的二进制绝对值。
  • 负数:符号位为1,数值位为该数绝对值的二进制。

20.2.2 表示方法

以8位二进制数为例(1位符号位+7位数值位):

  • 真值+5的原码:符号位0,数值位0000101,即00000101
  • 真值-5的原码:符号位1,数值位0000101,即10000101
  • 真值0存在两种形式:+000000000-010000000

20.2.3 特点

  1. 直观易懂,与真值对应关系简单;
  2. 加减法运算复杂,需要先判断符号再决定加减;
  3. 存在两种0的编码,浪费存储空间。

20.3 反码(One's Complement)

20.3.1 定义

  • 正数:反码与原码完全相同。
  • 负数:符号位保持1,数值位按位取反(0变1,1变0)。

20.3.2 表示方法

8位二进制示例:

  • +5 原码00000101,反码同为00000101
  • -5 原码10000101,数值位取反得到11111010(反码);
  • 0同样两种形式:+0=00000000-0=11111111

20.3.3 特点

  1. 正数原反码一致;
  2. 仍存在双零问题;
  3. 加法有循环进位规则:两数反码相加,若最高位产生进位,将进位加到最低位。

示例:计算 5+(3)5+(-3)

  1. +5反码:00000101
  2. -3原码10000011,反码11111100
  3. 相加:00000101+11111100=10000000100000101 + 11111100 = 100000001
  4. 循环进位:进位1加到末尾 00000001+1=0000001000000001+1=00000010,真值为2。

20.4 补码(Two's Complement)

补码是计算机标准有符号整数编码,解决双零、减法复杂问题。

20.4.1 定义

  • 正数:补码 = 原码 = 反码;
  • 负数:反码 + 1(无循环进位)。

20.4.2 表示方法

8位示例:

  • +5:00000101
  • -5 原码10000101 → 反码11111010 → 补码11111011
  • 0仅有唯一编码00000000

20.4.3 n位补码取值范围

n位(1符号位,n-1数值位): 2n12n11-2^{n-1} \sim 2^{n-1}-1 8位范围:128127-128 \sim 12710000000专门表示-128,无对应原反码。

20.4.4 运算规则

  1. 加法:[A+B][B]=[A][B]+[B][B][A+B]_{[B]_{补}} = [A]_{[B]_{补}} + [B]_{[B]_{补}},直接相加,溢出结果无效;
  2. 减法:[AB][B]=[A][B]+[B][B][A-B]_{[B]_{补}} = [A]_{[B]_{补}} + [-B]_{[B]_{补}},减法转为加负数补码; 求B-B补码:对[B][B][B]_{[B]_{补}}全部位取反再加1。

示例1:535-3 +5补码00000101,-3补码11111101 相加:00000101+11111101=10000001000000101 + 11111101 = 100000010,舍弃进位得00000010,真值2。

示例2:353-5 +3补码00000011,-5补码11111011 相加得11111110(负数补码),还原:补码-1得反码11111101,数值位取反,原码10000010,真值-2。

20.4.5 补码优势

  1. 0唯一,节省存储;
  2. 减法完全转为加法,硬件只需加法器;
  3. 多一个最小负数,取值范围更大。

20.5 三种编码转换关系

20.5.1 正数

[X]=[X]=[X][B][X]_{原} = [X]_{反} = [X]_{[B]_{补}}

20.5.2 负数

  1. 原码 → 反码:符号不变,数值位取反;
  2. 反码 → 补码:整体+1;
  3. 补码 → 原码:两种方式
    • 补码全部位取反加1;
    • 补码-1得到反码,数值位取反。

示例 X=-5(8位) 原码:10000101 反码:11111010 补码:11111011 补码求原码:11111011取反00000100 +1 → 0000101,加符号位10000101

20.6 补码溢出

运算结果超出n位补码范围即为溢出,结果错误。

20.6.1 判断方法

  1. 双符号位:00正、11负;运算后01正溢出,10负溢出;
  2. 单符号位:
    • 两个正数相加,结果符号为1 → 正溢出;
    • 两个负数相加,结果符号为0 → 负溢出;
    • 一正一负相加永远无溢出。

示例:8位计算120+10 120补码01111000,10补码00001010 相加得10000010,符号位变为1,正溢出(130>127)。

20.7 计算机选用补码的原因

  1. 硬件简化:仅需加法电路,减法转换加法;
  2. 零统一:消除±0两种编码;
  3. 空间充分:多表示一个负极值,提升存储利用率。