This question already has answers here:
unexpected behavior of bitwise shifting using gcc
                                
                                    (1个答案)
                                
                        
                        
                            Unexpected C/C++ bitwise shift operators outcome
                                
                                    (6个答案)
                                
                        
                                6年前关闭。
            
                    
main()
{
   int i=-1,j=32,k;
   k=i<<j;
   printf("i=%d j=%d k=%d\n",i,j,k);
}


输出:

i=-1 j=32,k=-1


如果我取j = 33,则k=-2,如果j = 34,则k = -4。它在左移32次后重复,即如果j = 64,k变为-1,如果j = 65,则k = -2。但逻辑上应该丢失位,即输出为0。这里发生了什么。

很抱歉提出这样的问题。我是初学者,所以我不明白编译器在这里做什么。你可以解释吗?

最佳答案

将值移位等于或大于其大小的值时,您不能指望获得有意义的结果。从标准:


  如果右操作数的值为负或大于或
  等于提升的左操作数的宽度,其行为为
  未定义。

10-08 05:22