游乐游手机版
首页/AI热点日报/热点详情

计算机负数为什么要用补码表示

类型:热点整理2026-07-09
在计算机领域,数字的编码方式蕴含着许多精妙的设计理念。今天我们来深入讨论机器数与真值的概念,以及原码、反码、补码——这些基础知识看似简单,但一旦彻底掌握,许多底层运行机制便会变得清晰易懂。 机器数与真值 机器数 一个数值在计算机中的二进制表现形式,被称为它的机器数。机器数带有符号位:正数的符号位为0

在计算机领域,数字的编码方式蕴含着许多精妙的设计理念。今天我们来深入讨论机器数与真值的概念,以及原码、反码、补码——这些基础知识看似简单,但一旦彻底掌握,许多底层运行机制便会变得清晰易懂。

机器数与真值

机器数

一个数值在计算机中的二进制表现形式,被称为它的机器数。机器数带有符号位:正数的符号位为0,负数的符号位为1。然而,不能简单地把符号位改为1就得到负数的表示——来看下面的示例:

  • 十进制数 +3,机器数为 00000000000000000000000000000011
  • 十进制数 -3,机器数并非 10000000000000000000000000000011 这么直接。实际存储的是 11111111111111111111111111111101 ——这是 -3 的补码形式。因为负数在计算机内部都是以补码方式存储的

真值

真值指的是数学意义上的实际数值。由于最高位用作符号位,机器数的形式值与其真值并不相等。例如:

00000000000000000000000000000011 -> +3
11111111111111111111111111111101 -> -3

上述讨论针对有符号数。对于无符号数而言,机器数与真值是完全一致的。

无符号数与有符号数的换算方法

无符号数换算

使用函数 B2Uw(Binary to Unsigned)来表示,宽度为 w:

以4位二进制数为例:

有符号数的换算方法

上文提到,有符号数在计算机中以补码形式存在,其换算公式用 B2Tw(Binary to Two's complement)表示:

下面以4位二进制数为例:

此外,还有一种更通用的方法:利用原码、反码、补码之间的转换规则

原码、反码、补码

计算机中机器数的运算效率问题

首先要明确:计算机内部统一使用加法运算。没错,计算机本身并不会直接执行减法。在补码概念提出之前,让我们观察几个例子:

可以看到,当负数参与加法运算时,结果竟然出现了错误。

为了获得正确结果,计算机不得不采用迂回方式,这必然影响运行效率。为了解决这一效率瓶颈,科学家们提出了补码的概念。

补码

利用补码获取真值

如何通过补码规则得到负数的真值呢?

假设我们从计算机中读取到一个二进制数 10000001(8位机器数),如何求得它的真值?

  • 步骤1:首先 10000001 是补码形式的机器数。实际上,在计算机系统中所有整数(包括正数和负数)都以补码形式存储——正数的补码与其原码相同,因此统称为补码并无问题。
  • 步骤2:根据补码转换为反码的规则,补码 10000001 减1,得到反码:10000000
  • 步骤3:按照反码转换为原码的规则,符号位保持不变,其余各位取反,得到原码:11111111
  • 步骤4:依据原码的真值定义:符号位不参与数值计算,其余位即为真值的绝对值,因此真值为 -127。

补码的运算逻辑

回到之前讨论运算效率时列举的正正、负负、正负相加的示例。现在我们用补码来重新审视:

可以看出,将符号位的含义以补码形式存入计算机后,减法运算就能被加法所替代,从而大幅提升了运行效率。

补码的设计由来

前面介绍了许多内容,但大家可能会问:补码到底是如何设计出来的?这其实与数学中的“补数”概念密切相关。

补数

生活中有很多实例——凡是具有周期性的系统,都可以用补数来描述。例如时钟或转盘:

假设当前时间是2点,想让指针指向12点,有两种操作方式:

  • 方式1:顺时针旋转10格,执行的是加法(+10)。
  • 方式2:逆时针旋转2格,执行的是减法(-2)。

无论采用哪种方式,指针最终都指向12点,效果完全相同。我们就称+10和-2互为补数,它们的绝对值之和12即为补数的模。

这一规律被应用于计算机二进制运算中。来看一个例子:假设要计算 5 + (-1) = 5 + ( ? )

  • 5在计算机中的原码:00000101
  • -1在计算机中的原码:10000001

要将减法转化为加法,关键在于找到合适的模,然后用-1的正补数进行加法运算。 回想时钟的例子,每拨12格为一个周期。对于8位二进制数,其取值范围是 -128 ~ 127(这里用8位简化分析,实际系统中常采用32位或64位),它的一个周期是256,因此模为256(即 1 0000 0000)。无论加256还是减256,二进制值都不变,因为溢出位会被丢弃。

由此,我们找到-1的模是256,其补数为+255(0 1111 1111)。于是 5 - 1 就转换为 5 + 255:

5:   0000 0101
255: 0 1111 1111
相加后:1 0000 0100  -> 最高位溢出丢弃,结果为4

看,结果与5-1是不是完全一致?

计算机中的补码正是遵循这一思路:找到与负数等价的正补数,用该正补数替代负数,从而将减法运算转化为两个正数的加法。补码的诞生与运算器电路设计密切相关——从设计者的角度出发,当然希望电路越简单越好,而利用正补数代替负数可以直接去掉减法器,大大简化电路结构。

我们下期再见。

参考资料:为什么计算机中的负数要用补码表示?

来源:https://m.elecfans.com/article/2046556.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。