为什么下面的代码使用gcc编译,打印出“ffffffff 0”而不是“0 0”?这两位在两条指令中右移32位。它没有多大意义,因为x == 32,但还是这个奇怪的结果发生......C移位时的奇怪行为
#include <stdio.h>
int main(void)
{
int x = 32;
printf("%x\n", 0xffffffff >> x);
printf("%x\n", 0xffffffff >> 32);
return 0;
}
EDIT2: 是,编译器警告我。但这不是重点。我使用0xffffffff作为掩码,用变量移位。例如,当我用8位移位时,我想要0xffffff(并且这样做)。当我用31位移位时,我想要0x1作为结果(并且这样做)。当我用32位转换时,它给了我0xffffffff(而不是0,当我有32作为文字,而不是变量时,这是beahaviour)。这很奇怪,对于我的目的来说,制作一个32位的特殊情况真的很不方便,因为它应该给0(并且它,但是只有当32是文字时)
你的编译器**甚至警告你**。这是UB。 –
您的文字图像[不是非常有用](// meta.unix.stackexchange.com/q/4086)。它不能被复制到编辑器中,而且它的索引也不是很好,这意味着具有相同问题的其他用户不太可能在此找到答案。请[编辑]您的文章直接合并相关文本(最好使用复制+粘贴以避免转录错误)。 –
是的,它确实警告过我。但关键是第二个操作数在这两种情况下仍然是32。这是未定义的行为,我明白了,但为什么在这两种情况下未定义的行为是不同的? @TobySpeight你有文本中的源代码。该图像用于证明发生这种情况并让人们看到编译器的版本以及我如何编译它 – caution2toxic