您好
为什么此功能的两个数字都打印相同?这不是循环转变。
unsigned int i=0x89878685;
int main()
{
printf("0x%x\n", i);
printf("0x%x\n", i>>32);
}
$ ./a.out
0x89878685
0x89878685
所有编译器都以这种方式工作吗?
答案 0 :(得分:10)
将32位整数移位32位是未定义的行为。结果是不可预测的。
在C和C ++中,如果整数具有N
位,则只允许移位少于N
位。如果您移动N
或更多,则行为未定义。
实际上,当移位32位整数时,某些平台只会将移位计数解释为5位值(丢弃低于5的任何位),这意味着32
将被解释为相同作为0
的方式。这显然是在您的平台上发生的事情。该值根本没有转移。