第20章 数据编码
在计算机中,数值是以二进制形式存储的,而原码、反码、补码是表示有符号整数的三种编码方式。它们的设计目的是解决计算机中负数的表示和运算问题,尤其是如何通过加法运算实现减法操作。本章将详细介绍这三种编码的定义、表示方法、转换规则及实际应用。
20.1 机器数与真值
机器数:一个数在计算机中的二进制表示形式,包含符号位和数值位。通常用最高位表示符号(0表示正数,1表示负数),其余位表示数值的绝对值。例如,8位二进制数00000101 和10000101都是机器数。
真值:机器数所对应的实际数值。例如,机器数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存在两种形式:
+0为00000000,-0为10000000。
20.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 特点
- 正数原反码一致;
- 仍存在双零问题;
- 加法有循环进位规则:两数反码相加,若最高位产生进位,将进位加到最低位。
示例:计算
- +5反码:
00000101 - -3原码
10000011,反码11111100 - 相加:
- 循环进位:进位1加到末尾 ,真值为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数值位):
8位范围:,10000000专门表示-128,无对应原反码。
20.4.4 运算规则
- 加法:,直接相加,溢出结果无效;
- 减法:,减法转为加负数补码; 求补码:对全部位取反再加1。
示例1:
+5补码00000101,-3补码11111101
相加:,舍弃进位得00000010,真值2。
示例2:
+3补码00000011,-5补码11111011
相加得11111110(负数补码),还原:补码-1得反码11111101,数值位取反,原码10000010,真值-2。
20.4.5 补码优势
- 0唯一,节省存储;
- 减法完全转为加法,硬件只需加法器;
- 多一个最小负数,取值范围更大。
20.5 三种编码转换关系
20.5.1 正数
20.5.2 负数
- 原码 → 反码:符号不变,数值位取反;
- 反码 → 补码:整体+1;
- 补码 → 原码:两种方式
- 补码全部位取反加1;
- 补码-1得到反码,数值位取反。
示例 X=-5(8位)
原码:10000101
反码:11111010
补码:11111011
补码求原码:11111011取反00000100 +1 → 0000101,加符号位10000101。
20.6 补码溢出
运算结果超出n位补码范围即为溢出,结果错误。
20.6.1 判断方法
- 双符号位:00正、11负;运算后01正溢出,10负溢出;
- 单符号位:
- 两个正数相加,结果符号为1 → 正溢出;
- 两个负数相加,结果符号为0 → 负溢出;
- 一正一负相加永远无溢出。
示例:8位计算120+10
120补码01111000,10补码00001010
相加得10000010,符号位变为1,正溢出(130>127)。
20.7 计算机选用补码的原因
- 硬件简化:仅需加法电路,减法转换加法;
- 零统一:消除±0两种编码;
- 空间充分:多表示一个负极值,提升存储利用率。