我正在努力换班,我遇到了这个问题 我有两个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.我知道这是错的,但任何人都可以解释为什么???
答案 0 :(得分:1)
您将转移与转动:
混淆转移表示移动所有位并用0填充空白点 或1(取决于价值和/或签名)。
旋转正在移动所有位并用该位填充空白点 最终“垮掉”了。
AFAIK C不支持旋转,但只支持移位(可能是因为平台依赖性?)。 x86汇编程序实现了移位和旋转操作。
可以在此处找到比我更好的解释:http://en.wikibooks.org/wiki/X86_Assembly/Shift_and_Rotate
答案 1 :(得分:0)
我的意思是,当我们不能再向左移动时,我们不要回头开始吗?
没有。这种行为称为循环移位,并且不移位运算符在C中的工作方式。
(顺便说一句,对我来说,两个表达式都按printf("%d %d\n", 1 << (31 + 1), 2 << 31);
得到0,但这不是很有意义,因为有符号整数溢出是未定义的行为。)
答案 2 :(得分:0)
如H2CO3所述,行为未定义。您可以参考C99 6.5.7获取更多信息。此外,this question非常相似,如果不是与您的相同。你也可以在那里找到一些好的信息。
顺便提一下,我的系统将班次调整为32。