int a =1,b =35 ;
printf("%d,%d",a<<b,1<<35);
输出:8,0
原因如下:
而IntelCPU执行shl指令时,会先将b与31进行and操作,以限制左移的次数小于等于31。因为35 & 31 =3,所以这样的指令相当于将1左移3位,结果是8。
而j=1<<35;一句是常数运算,VC即使不做优化,编译器也会直接计算1<<35的结果。VC编译器发现35大于31时,就会直接将结果设置为0。
因此,上述变量操作运算等价于:
a<<b&31
常数则不变化!
参考来源