0

对有符号整数 -28 进行逻辑右移 3 操作。正确答案是什么?

  1. +203
  2. +83
  3. +3
  4. -3

2 的 -28 的补码是 11100100。现在,如果我应用逻辑右移操作,我不会得到上述任何一个答案。

4

4 回答 4

1

我几乎可以肯定这是一个技巧问题。

面试官在看你是否会回答“-3”。如果你有(错误的推理是因为 28>>>3 是 3,那么 -28>>>3 是 -3),他会意识到你不理解二进制补码。

他要你回答这四个选项都不正确。他想让你

  1. 解释逻辑右移与算术右移不同,如何通过将符号位转换为幅度的一部分,将一个小的负数变成一个巨大的正数
  2. 指出答案取决于用多少字节来表示一个 int
于 2010-10-10T05:10:32.933 回答
0

将有符号整数右移可以做很多事情:

  1. 如果数字是负数,它将对结果进行符号扩展(在左侧移动 1 位),这应该具有使数字看起来像一个较小的负数的效果。
  2. 如果数字是正数,它会为您移动的每一位将其除以二。

但这种行为在技术上是“实现定义的”。

请参阅这篇文章:C 中的移位运算符(<<,>>)是算术还是逻辑?

于 2014-05-01T21:53:17.663 回答
0

这是一个愚蠢的问题:

  • 在左侧添加 0 还是 1 并没有普遍定义为负数(维基百科说“填充空位,通常用零” - 我的重点)
  • 没有讨论所涉及的整数大小,并且
  • 有多个负数的按位表示正在使用中。

一些语言(我相信像 Java)是新的最重要的位,这样任何没有合适的 CPU 指令的平台都必须发出几个来计算所需的答案,而其他语言可能会在两者之间做出实现定义的选择CPU 本身提供的行为。

2 的补码是负数最常见的表示。您的问题指出“-28 的 2 的补码是 11100100。”...我猜这不是问题的一部分(如果是这样的话有点奇怪,因为它在答案之后)。仍然...

如果我们用 2 的补码运行......

11100100 >> 3 = 00011100 or 11111100 = 28 or -4

如果表示是 1 的补码:

11100011 >> 3 = 00011100 or 11111100 = 28 or -3

如果表示是符号位,绝对值:

10011100 >> 3 = 00010011 or 11110011 = 19 or -(127-12)=-115

(note that the question says a logical bit shift, which by definition ignores any possible interpretation of the bits, so the sign bit is shifted along with others)

Re #bits in an int ... 我认为这很明显,这会导致值太大而无法匹配任何选项,否则不会有任何区别(如果在左侧添加 1 1 或 2 的补码),我们可以忽略这个问题。

因此,除非我上面的快速计算出现失误,否则 -3 是唯一在任何合理架构上可能是正确的答案,但仍然不太可能。总而言之,我想知道他们是否真的在测试,看看谁有信心不回答这个问题,或者注释说没有一个答案可能是正确的......

于 2010-10-12T01:24:40.587 回答
0

也许诀窍不是假设二进制补码表示。假设符号和大小表示,答案可能是 -3,因为大多数移位实现不涉及符号位。

于 2010-10-10T15:31:43.507 回答