移位操作的奇怪问题

http://topic.csdn.net/u/20090526/11/c3afa298-8223-444c-9fe3-59661c4f6ddf.html

void main( ) { int iPos = 0; int iInc = -1; int iDst = 1 < < (iPos + iInc); cout < < iDst < < endl; }

显示的是一个负数,但将int iDst = 1 < < (iPos + iInc);改为int iDst = 1 < < (-1);的时候,将会显示:0
同样是1 < < -1 ,为什么会不同的呢?

编译器只进行32以内的移位(也就是寄存器的后五位的值),-1是0xFFFFFFFE,为非法值,因此编译期,编译器就将结果置零。

而未优化的情况下,1 << var 不被编译器计算出 var 值,则取寄存器的后五位进行移位……运行期操作。

你可能感兴趣的:(移位操作的奇怪问题)