首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

异常的移位

2013-02-18 
错误的移位iPanes 1iBitsPixel 32int iColors(1(iPanes*iBitsPixel))00031444movecx,dword ptr [i

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

热点排行