C 语言中的 2 的补码是什么?

2025年3月28日 | 阅读 5 分钟

C 语言中的 2 的补码是由 1 的补码生成的。如我们所知,一个二进制数的 1 的补码是通过将位 1 转换为 0,将位 0 转换为 1 来创建的;一个二进制数的 2 的补码是通过在 1 的补码的基础上加一生成的。

简而言之,我们可以说 C 语言中的 2 的补码定义为 1 的补码与 1 的和。

2s complement in C

在上图中,二进制数等于 00010100,其 1 的补码是通过将位 1 转换为 0,将位 0 转换为 1 来计算的。因此,1 的补码变为 11101011。计算完 1 的补码后,我们通过将 1 加到 1 的补码上来计算 2 的补码,其结果是 11101100。

让我们创建一个 2 的补码程序。

输出

2s complement in C

对上述程序的分析:

  • 首先,我们输入位数,并将其存储在“n”变量中。
  • 输入位数后,我们声明一个字符数组,即 char binary[n+1],它将保存二进制数。'n' 是我们在上一步中输入的位数;它基本上定义了数组的大小。
  • 我们还声明了两个数组,即 onescomplement[n+1]twoscomplement[n+1]onescomplement[n+1] 数组保存二进制数的 1 的补码,而 twoscomplement[n+1] 数组保存二进制数的 2 的补码。
  • 初始化 carry 变量,并为其赋值 1。
  • 声明完成后,我们输入二进制数。
  • 现在,我们简单地计算二进制数的 1 的补码。为此,我们创建一个 **循环**,该循环遍历二进制数组,**for(int i=0;i<n;i++)**。在 for 循环中,检查位是 1 还是 0。如果位是 1,则 **onescomplement[i]=0**,否则 **onescomplement[i]=1**。这样,就生成了二进制数的 1 的补码。
  • 在计算完 1 的补码后,我们生成二进制数的 2 的补码。为此,我们创建一个 **循环**,该循环从最后一个元素迭代到第一个元素。在 for 循环中,我们有三个条件:
    • 如果 onescomplement[i] 的位是 1 且 carry 的值为 1,则我们将 0 放入 twocomplement[i]。
    • 如果 onescomplement[i] 的位是 0 且 carry 的值为 1,则我们将 1 放入 twoscomplement[i] 且将 carry 设为 0。
    • 如果以上两个条件不成立,则 onescomplement[i] 等于 twoscomplement[i]。

有符号整数 在 C 中通常使用 二补码表示法 来表示。使用相同的 二进制表示 提供了一种表示 正数负数 的机制。在 二补码表示 中,最高有效位 (MSB) 用作 符号位,其中 0 表示 正整数1 表示 负数

负数 的绝对值开始,将其转换为二进制形式,然后对其值进行 一补码(按位取反) 操作,即可获得 负整数二补码 表示。您将 1 加到 结果值 上,即可获得 二补码 的表示。

C 语言中的 二补码编码 可以表示 有符号整数 并执行快速算术运算。使用二补码的一个优点是能够使用与无符号数相同的二进制运算来执行 加法减法

当对二补码进行加法运算时,二进制数 就如同 无符号整数 一样相加。从 主关键位 位置产生的进位会被简单地忽略。由于这个事实,无需以不同的方式处理 有符号数,加法变得简单。

例如,考虑使用 8 位二补码 表示法添加 -5-3

-5 的二进制数为 11111011

-3 的二进制数为 11111101

进行加法运算

结果是 111110100,其 二补码 表示等于 -8

与加法类似,可以通过将 第二个操作数 的二补码视为加法来进行减法。换句话说,您将负数的二补码加到第一个操作数上以消除它。

例如,当从 -5 中减去 -3 时:

在二进制中,-5 表示为 11111011,而 -(-3) 表示为 00000011-3 的二补码)。

进行减法运算

结果是 11111110,其二补码表示等于 -8

结论

在 C 语言中,2 的补码 是一个负数的二进制表示,它是通过将 1 的补码 加一创建的。计算机系统经常使用这种思想来表示有符号数并高效地执行算术运算。

要获取二进制整数的 2 的补码,必须首先通过翻转位来确定该数的 1 的补码。然后,通过将 1 的补码 **加一** 来获得 2 的补码 的表示。最高有效位 (MSB) 将充当符号位,表示一个数是 正数 还是 负数

所附的 C 程序显示了给定二进制整数的 2 的补码 的计算。系统会提示用户输入二进制数和位数。然后,程序执行必要的步骤来获得 1 的补码,然后是 2 的补码。最后显示结果。

在计算机科学和编程中,理解 2 的补码 表示至关重要,因为它能够有效地处理用二进制表示的负值。它简化了 正数负数加法、减法逻辑运算。由于 2 的补码 表示,可表示整数 的范围关于 对称,这使其适用于各种数值运算。

通过理解 2 的补码的概念并正确使用它,程序员可以在 C 和其他编程语言中执行算术运算,处理二进制数据,并设计有符号整数的算法。