软件设计师考试 - 数据表示(原码、反码、补码、移码)

软件设计师考试 - 数据表示(原码、反码、补码、移码)

   概要 

   计算机只认识 0 和 1,但现实世界中既有正数,也有负数。当计算机刚诞生时,人们面临一个基础问题:如何用二进制表示带符号的整数?

   围绕这个问题,工程师们经历了一次逐步演进的探索过程,于是出现了四种数据表示方式:原码、反码、补码、移码

   它们不是同时诞生的,而是在不断解决问题的过程中逐步演化出来的。

   一、原码(最直观的表示方式)

   1. 定义

   原码是一种最自然、最直观的带符号整数表示方式。

   规则如下:

  • 最高位为符号位
  • 0 表示正数
  • 1 表示负数
  • 其余位表示数值的绝对

    简单来说:原码 = 符号位 + 数值的二进制表示

    2. 举例说明

    | 十进制 |   原码表示  |
    | ----- | --------- |
    | +5      | 0000 0101   |
    | -5      | 1000 0101    |
   解释:

   +5:符号位 0,数值部分 0000101

   -5:符号位 1,数值部分 0000101

   可以看到,正负数只有最高位不同。

   3. 原码的优点

   表示方式直观、容易理解、符号与数值分离清晰

   这也是为什么在学习计算机组成原理时,通常会先介绍原码。

   4. 原码的缺点

   虽然直观,但原码存在明显问题:

   1)存在两个 0
   +0 = 0000 0000
   -0 = 1000 0000

   计算机中出现两个 0,会增加逻辑复杂度。

   2)运算复杂

   例如计算:5 + (-5)

   如果使用原码,符号和数值需要分开判断处理,不能直接用普通加法完成。这会使硬件设计变得复杂。

   二、反码(对原码的改进尝试)

   1.  定义

   反码是在原码基础上的一种改进方案,目的是让减法运算更容易实现。

   规则如下:

  • 正数的反码 = 原码
  • 负数的反码 = 符号位不变,其余各位按位取反

   也就是说:反码 = 原码(正数不变,负数除符号位外全部取反

   2.  举例说明(以 8 位二进制为例)

   以 5 为例:
   | 十进制 | 原码 | 反码 |
   | --- | --------- | --------- |
   | +5   | 0000 0101   | 0000 0101   |
   | -5   | 1000 0101    | 1111 1010     |

  解释:

  -5 原码:1000 0101

  -5 反码:除符号位外取反:1111 1010

  3.  反码的优点

  减法可以部分转化为加法

  比原码更接近实际运算需求

  4.  反码的缺点

  1)仍然存在两个 0

  +0 = 0000 0000
  -0 = 1111 1111

  双零问题依然存在。

  2)运算规则仍然不够简洁

  反码加法在出现进位时,需要“末位回卷”(循环加 1),增加了电路复杂度。

  小结:反码是对原码的一次改进,但并没有彻底解决问题。于是,人们继续优化,最终得到了更完美的方案 —— 补码。

  三、补码(现代计算机采用的表示方式)
  1. 定义

  补码是在反码基础上进一步改进得到的。

  规则如下:

  • 正数的补码 = 原码
  • 负数的补码 = 反码 + 1

  也可以理解为:负数补码 = 对原码(除符号位外)取反,再加 1

  2. 举例说明(以 8 位二进制为例)

  以 -5 为例:

  原码:1000 0101

  反码:1111 1010

  补码:1111 1011
   | 十进制   |   补码          |
   | ---       | --------- |
   | +5         | 0000 0101 |
   | -5         | 1111 1011    |

  3.  补码的优点

  1)只有一个 0

  表示为: 0000 0000

  解决了双零问题。

  2)加减法可以统一

  表示为: 5 + (-5)

  补码表示:

   0000 0101
  +1111 1011
  -----------
  1 0000 0000

  丢弃最高位进位,结果为:0000 0000。运算过程完全等同于普通二进制加法

  3)硬件实现简单

  计算机只需要一套加法电路,就可以完成加法和减法。

  这大大降低了硬件复杂度。

  4. 表示范围(8 位)

  最小值:1000 0000 → -128

  最大值:0111 1111 → 127

  表示范围为:-128 ~ 127

   5. 小结

   补码彻底解决了-双零问题、运算复杂问题、硬件实现复杂问题。因此,现代计算机全部采用补码表示整数。

   四、移码(主要用于浮点数)

   1. 定义

   移码是在补码基础上的一种变形形式。

   规则:

  • 移码 = 补码的符号位取反
  • 或者从数学角度理解:在原数值基础上加上一个固定偏移量(Bias)

   2. 举例说明(8 位)

   以 -5 为例:

   补码:1111 1011

   移码:0111 1011

   移码的特点:

  • 没有符号位的负数表示
  • 所有数看起来都是“无符号数”
  • 非常方便比较大小

    说明:移码是另一种负数表示法,主要用于浮点数的阶码或某些特殊整数运算。它的特点是没有单独的符号位,而是通过“整体加上一个偏移量”来表示正负。

 

   3. 应用场景

   移码主要用于:

  • 浮点数的指数部分
  • 科学计数法表示
  • 在 IEEE754 标准中,指数部分就是采用移码表示。

   4. 小结

  移码并不是用来表示普通整数的,而是为浮点数设计的一种特殊编码方式

  五、最终总结对比

  | 编码方式   | 是否有两个 0 | 运算是否方便 | 实际是否使用 |
  | ----        | -------    | ------        | ------    |
  | 原码          |      有        |      否           |   不使用    |
  | 反码          |      有        |      一般        |   不使用    |
  | 补码          |      无        |      是           |   使用       |
  | 移码          |      无        |      用于比较  |   用于浮点 |

  原码、反码、补码的概念只对负数有实际意义,对于正数,它们都一样。

​  +9    ->   +0001001   -> 00001001  -> 00001001  ->  0 0001001
​  -9    ->   -0001001   -> 1001001    ->  11110110    ->  1 1110111
 (十进制数) (真值)        (原码)          (反码)       (补码)

 表示范围:

 

image

 

  在计算机内存中,整数一律采用补码的形式来存储。这意味着,当读取整数时还要采用逆向的转换,也就是将补码转换为原码。
  将负数的补码转换为原码也很简单:先减去 1,再将数值位取反即可。

 

 

posted @ 2026-02-14 14:08  欢乐豆123  阅读(68)  评论(0)    收藏  举报