移位超过32位会如何?
#include <stdio.h> int main (void) { int i = 0xFFFFFFFF; __asm { push eax; mov eax,i; sal eax,31; sal eax,1; mov i,eax; pop eax; }; printf ( "0x%0X \n",i ); i = 0xFFFFFFFF; __asm { push eax; mov eax,i; sal eax,32; mov i,eax; pop eax; }; printf ( "0x%0X \n",i ); return (0); }
为什么先移位 31,再移位1位,就可以达到全部移出32位的目的呢?
为什么直接移位32位,却达不到目的呢??
其实是很简单,因为移位操作,移位的位数,会进行一个mask (&0x1F)操作,这是微指令做的,就是 cl & 0x1F,相当于 cl – 32 (cl > 31) ,
这样前面的就非常好解释了。。。。