0

我正在研究按位运算和有符号数字表示。我已经认识到,如果我们在补码模式上进行左移。它没有正确地乘以原始数字。

例如(一个补码):

11100101 (-26) << 1 = 11001010 (-53)

11110100 (-11) << 2 = 11010000 (-47)

-26 左移 1 位给出 -53(不是 -52),-11 左移 2 位给出 -47(不是 -44)。这就是人们选择二进制补码进行精确数字运算的原因。我在谷歌上搜索过,但没有提到左移和补码的帖子。几乎提到了带补码的左移

4

1 回答 1

2

在二进制补码中,负数 A 由正数 2 n -|A|编码。并且可以通过 -2 n-1 × a n-1 + ∑<sub>0 n-2 2 i × a i找到它的值很容易证明,将这个值左移 k 位将给出代码的 A×2 k,前提是没有溢出(即只有零或只有一个被移出)。

在一个补码中,负数 A 由(A 的 2 的补码)-1 编码。其值为 -2 n-1 × a n-1 + ∑<sub>0 n-2 2 i × a i -1。如果我们将其左移 k,则结果的数值为 (2 的补码 2 k *A)-2 k *1(前提是没有溢出)。它与预期结果相差 2 k -1,预期结果是(2 k *A 的 2 的补码)-1

我们可以在您的示例中进行验证:

C1(-26)<<1=-53(=-52-(2 1 -1))
C1(-11)<<2=-47(=-44-(2 2 -1))

因此,要将在 1 的补码中编码的负数乘以 2 k,您需要将其左移 k 并将结果添加到 2 k -1

通常,只有二进制补码提供简单的算术运算。其他代码(超 k、一个补码、符号绝对值)总是需要更正(这就是它们很少使用的原因)。

于 2019-04-16T12:00:55.327 回答