异常的移位

错误的移位
iPanes = 1
iBitsPixel = 32

int iColors=(1<<(iPanes*iBitsPixel));
00031444  mov         ecx,dword ptr [iPanes] 
00031447  imul        ecx,dword ptr [iBitsPixel] 
0003144E  mov         eax,1 
00031453  shl         eax,cl  //这里 的eax的值是1, 不应该是0吗?
00031455  mov         dword ptr [iColors],eax 

eax循环32次后,值是1 ,诡异,应该是0才对啊




------解决方案--------------------
假设要移X位,用X和32比较,必须要小于32,(严格说是X<sizeof(int))。不是用sizeof(X)和32比较。

碰到移位大于或等于32的情况,根据具体情况,要么取零iColors=0,要么取模iColors=1<<(X%32),要么报错。

如果是立即数,你肯定知道其类型和数值,就不用sizeof()了。

还有最好不要同时用int和32,要么用int和sizeof(int),要么用INT32和32,或者INT64和64。不要假定int是32位的。