异常的移位
错误的移位
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位的。
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位的。