关于移位操作

关于移位操作
  看CSAPP讲解移位操作的时候,突然想起了以前曾经遇到的一个诡异问题:
 1  #include  < iostream >
 2  using   namespace  std;
 3 
 4  int  main()
 5  {
 6       int  i  =   10 , d  =   32 ;
 7 
 8      printf( " %d\n " , i  >>  d);
 9 
10       return   0 ;
11  }
12 

  这里输出仍然是10。一直不理解为什么是这样,正常理解输出是0才对。后来到网上查阅了一下,原来在C99标准中规定如果移位操作的位数大于等于位宽那么结果是未定义的。这句话居然在K & R的著作中就有提到,实在是牛。
  这段代码实际执行的时候,据说硬件会自动对字长取模,因此可以认为值没有改变。当然,如果换一种写法:
#include  < iostream >
using   namespace  std;

int  main()
{
    
int  i  =   10   >>   32 ;

    printf(
" %d\n " , i);

    
return   0 ;
}

  这样输出就是零了,但是有编译警告,看来编译器的想法和一般的想法是一样的,呵呵。

你可能感兴趣的:(关于移位操作)