转换正数,例如+7 到 8 位二进制补码,使用 4 步法显示前导 1

Convert positive number e.g. +7 to twos complement in 8 bits showing a leading 1 using 4 step method

出于教学目的,我希望在方法的上下文中理解以下内容(四个步骤,见下文):我正在尝试将 +7 转换为 8 位的二进制补码。根据 https://www.allmath.com/twos-complement.php 上显示的答案如下:

十进制 7 二进制 0000 0111 补 1111 1001

这显示负数,因为它以 1 开头。

答案不应该是0111吗

我希望能够使用这四个步骤得出答案。

第 1 步:将量级 (7) 转换为二进制。 0111 第 2 步:将 0 填充到所需的位大小。 0000 0111 第 3 步:反转位以实现 1 的补码。 1 1 1 1 1 0 0 0 STEP 4: 加1实现2的补码。

加 1 ------------------> 1 1 1 1 1 0 0 1

我的理解哪里错了。在处理二进制补码时,我们被告知如果它以 1 开头则为负数。那么将正十进制数转换为二进制补码的方法是什么,或者我们是否假设对于任何正十进制数,二进制补码就是它本身:

例如 7 = 0111 或 0000 0111 如果是 8 位?

这也意味着上面的 4 步方法不能用于正数?

讨论

(注意这里的讨论使用 TCR 表示“补码表示”)

不幸的是,您在此处提供的 material (allmath.com) 可能误解了什么是“补码”。很多书籍都对它给出了规范的定义,为方便起见,引用自Wikipedia:

即可

第一句:

Two's complement is a mathematical operation on binary numbers

,及其 mathematical operation 的定义:

w = -a_{n-1}2^{n-1} + a_{n-2}2^{n-2} + ... + a_{0}2^{0}

以二进制数11111001为例。如果没有 TCR,我们可以将其解释为 2^7 + 2^6 + 2^5 + 2^4 + 2^3 + 1 = 249。使用 TCR(即应用数学运算),我们将其视为 -2^7 + 2^6 + 2^5 + 2^4 + 2^3 + 1 = -7.

同样,对于另一个二进制数,说00000111。如果没有 TCR,我们将其视为 2^2 + 2^1 + 1 = 7。对于 TCR,我们将其视为 2^2 + 2^1 + 1 = 7,与前者相同。

回到你的场景

您的 4 步操作本质上是:获取给定数字取反的 TCR

还是以11111001为例,经过你4步操作后,变成00000111,也就是7,即-7 (11111001)的否定.同样,经过你的4步操作,00000111变成11111001,也就是-7,即7 (00000111)的否定。因此,您的 4 步操作的结果是调用 Two's Complement Negation,而不是 Two's Complement.

为什么容易混淆?

一个原因可能是:几乎所有计算机都采用了 TCR 概念。假设一台8位的计算机,当我们想看我们的计算机如何显示十进制数7时,我们的计算机会直接打印出7,这对大多数人来说是非常直观的。但是,对于十进制数249,它通常不会“服从你的命令”,而是打印出另一个值:-7.

反之,如果你想让你的电脑显示-7,根据Cornell University's Lecture Notes,你需要做的事情是:

  1. -7的绝对值开始,即7
  2. 7的二进制表示(即00000111)作为输入。
  3. 反转位。
  4. 加一个。 (请注意,1~4 与您的 4 步操作完全等价
  5. 将结果输入您的计算机。

然后我们的计算机将得到一个二进制表示 11111001(它是十进制的 249),并且它会在您的屏幕上显示为 -7

在这种情况下,您可以公平地说,在使用 TCR 的 8 位计算机中,-7 是二进制补码的 替代 表示 249。这句话虽然不太规范,但对刚接触TCR概念的人有所帮助。

关于TCR的概念,请参考Wikipedia大学讲义CS书籍精确的细节,而不是许多所谓的“在线速成课程”。