在C99中右移">>"

osg*_*sgx 3 c c99 bit-shift shift

可能重复:
右移操作员的奇怪行为

你好

为什么这个函数的两个数字都打印相同?它不是循环移位.

unsigned int i=0x89878685;
int main()
{
  printf("0x%x\n", i);
  printf("0x%x\n", i>>32);
}

$ ./a.out
0x89878685
0x89878685
Run Code Online (Sandbox Code Playgroud)

所有编译器都以这种方式工作吗?

AnT*_*AnT 10

将32位整数移位32位是未定义的行为.结果是不可预测的.

在C和C++中,如果整数有N位,则只允许移位少于N位.如果你转移N或更多,行为是未定义的.

实际上,当移位32位整数时,某些平台将简单地将移位计数解释为5位值(丢弃低于5的任何位),这意味着32将以相同的方式解释0.这显然是在您的平台上发生的事情.该值根本没有移动.

  • @osgx:无论他们想要什么,行为都是**未定义**. (8认同)
  • @osgx,我怀疑编译器采用移位运算符mod 32的右侧.所以在这种情况下`i >> 32`变为`i >>(32%32)== i >> 0 == i `. (2认同)