0

我正在研究位移,我遇到了这个问题。
我有两个int:

int x = 1;
int y = 2;

有什么区别:

 x = x << (31 + 1);

 y = y << 31;

我认为结果是相同的(即 x 和 y 都等于 1),但它们不是......我不明白为什么。2 只是 1,“1”位向左移动了一个空格。

谢谢!

我的意思是当我们不能再左移时,我们不回到开头吗?

编辑:让我澄清一下我的想法:

我们从 x = 1 开始,所以是:

 00000000 00000000 00000000 00000001

然后我们将其左移 31 +1(或 32)。这给了我们:

 00000000 00000000 00000000 00000001

这也是1。

然后我们做 y = 2,那就是

 00000000 00000000 00000000 00000010

我们将其左移 31。这也给了我们:

 00000000 00000000 00000000 00000001

因此,我们得到 x = y = 1。我知道这是错误的,但谁能解释为什么?

4

3 回答 3

1

你混淆了shiftrotation

  • 移位意味着移位所有位并用 0 或 1 填充空白点(取决于值和/或符号)。

  • Rotating is shifting all bits and filling the empty spot with the bit that "fell out" in the end.

AFAIK C does not support rotating, but only shifting (probably because of platform dependencies?). x86 assembler implements both shift and rotate operations.

A explanation better than I can give here, can be found here: http://en.wikibooks.org/wiki/X86_Assembly/Shift_and_Rotate

于 2012-10-13T18:02:13.793 回答
0

我的意思是当我们不能再左移时,我们不回到开头吗?

不,这种行为称为循环移位,这不是移位运算符在 C 中的工作方式。

(顺便说一句,对我来说,这两个表达式的结果都是 0 printf("%d %d\n", 1 << (31 + 1), 2 << 31);,但这不是很有意义,因为有符号整数溢出是未定义的行为。)

于 2012-10-13T17:46:37.343 回答
0

如 H2CO3 所述,行为未定义。您可以参考C99 6.5.7了解更多信息。此外,这个问题与您的问题非常相似,如果不完全相同的话。你也可以在那里找到一些很好的信息。

顺便说一句,我的系统将班次修改了 32。

于 2012-10-13T18:02:13.683 回答