对有符号整数-28进行逻辑右移3运算。什么是正确的答案?对有符号整数进行逻辑右移运算
- +203
- +83
- +3
- -3
2的-28补是11100100. 现在,如果我申请逻辑右移操作,我没有得到以上任何一个答案。
对有符号整数-28进行逻辑右移3运算。什么是正确的答案?对有符号整数进行逻辑右移运算
2的-28补是11100100. 现在,如果我申请逻辑右移操作,我没有得到以上任何一个答案。
我几乎可以肯定这是个诡计的问题。
面试官看到你是否会回答“-3”。如果你有(错误的推理,因为28 >>> 3是3,那么-28 >>> 3是-3),他会意识到你不明白二进制补码。
他希望你回答这四个选择中没有一个是正确的。他希望你
但是这是书面测试问题,我没有其他选择:-) – Jagan 2010-10-10 05:15:30
如果这是一个书面测试,你正在采取的过程中,你不能在这里发布它,我不能帮你。 – AlcubierreDrive 2010-10-10 05:16:41
@Jon Rodriguez:我不在考场编写在线考试。我将在1或2个月后参加考试。那么知道我不知道的事情有什么不对? – Jagan 2010-10-10 05:23:27
也许,关键是不要假定二进制补码表示。假设sign-and-magnitude表示,答案可以是-3,因为大多数移位实现不涉及符号位。
这是一个愚蠢的问题:
一些语言(如Java我相信)新的最显著位,使得没有一个合适的CPU指令的任何平台将不得不发行数计算所需的答案,而其它语言可作出在CPU本身提供的行为之间实现定义的选择。
2的补数是负数最常见的表示形式。你的问题是“-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)
在一个int重新#bits ...我认为这很明显,那会导致一个值太大而不能匹配任何选项,否则它不会有任何区别(如果1被添加到左边1或2的补码),我们可以忽略这个问题。因此,除非我的上述快速计算结果滑落,否则-3是唯一可以在任何合理架构上正确的答案,但仍然不太可能。总之,我想知道他们是不是真的在测试,看看谁有信心不回答问题,或者说没有答案可能是正确的......
将有符号的整数移到right可以做很多事情:
但是这种行为在技术上是“实现定义的”。
请看到这个帖子:Are the shift operators (<<, >>) arithmetic or logical in C?
你尝试写作和编译代码看?既然我没有和你面谈,我想我会继续回答。 – 2010-10-10 04:35:03
是的,我尝试使用>>>在java中执行此操作,我得到了非常大的数字(536870908)。 – Jagan 2010-10-10 04:41:21
@Jagan使用'(signed int)((unsigned int)-28 >> 3)'在C中得到了相同的结果。如果你仔细想一想,获得一个非常大的正值#是有意义的,因为你已经把曾经是符号位的1变成了第三个最重要的位。 – AlcubierreDrive 2010-10-10 04:53:50