


























概要
计算机只认识 0 和 1,但现实世界中既有正数,也有负数。当计算机刚诞生时,人们面临一个基础问题:如何用二进制表示带符号的整数?
围绕这个问题,工程师们经历了一次逐步演进的探索过程,于是出现了四种数据表示方式:原码、反码、补码、移码
它们不是同时诞生的,而是在不断解决问题的过程中逐步演化出来的。
一、原码(最直观的表示方式)
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
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. 定义
移码是在补码基础上的一种变形形式。
规则:
2. 举例说明(8 位)
以 -5 为例:
补码:1111 1011
移码:0111 1011
移码的特点:
说明:移码是另一种负数表示法,主要用于浮点数的阶码或某些特殊整数运算。它的特点是没有单独的符号位,而是通过“整体加上一个偏移量”来表示正负。
3. 应用场景
移码主要用于:
4. 小结
移码并不是用来表示普通整数的,而是为浮点数设计的一种特殊编码方式。
五、最终总结对比
| 编码方式 | 是否有两个 0 | 运算是否方便 | 实际是否使用 |
| ---- | ------- | ------ | ------ |
| 原码 | 有 | 否 | 不使用 |
| 反码 | 有 | 一般 | 不使用 |
| 补码 | 无 | 是 | 使用 |
| 移码 | 无 | 用于比较 | 用于浮点 |
原码、反码、补码的概念只对负数有实际意义,对于正数,它们都一样。
+9 -> +0001001 -> 00001001 -> 00001001 -> 0 0001001
-9 -> -0001001 -> 1001001 -> 11110110 -> 1 1110111
(十进制数) (真值) (原码) (反码) (补码)
表示范围:

在计算机内存中,整数一律采用补码的形式来存储。这意味着,当读取整数时还要采用逆向的转换,也就是将补码转换为原码。
将负数的补码转换为原码也很简单:先减去 1,再将数值位取反即可。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。