如何在执行SHL EAX, CL指令后检查无符号整数结果是否溢出?
检查
SHL EAX, CL后无符号结果是否溢出的简便方法 对于无符号整数的SHL EAX, CL操作,要判断理论结果(EAX × 2^CL)能否容纳在32位EAX寄存器中,有两种简便的检查方式:
直接检查进位标志CF:
SHL指令执行后,若CF=1,说明移位过程中有高位被移出寄存器,意味着原始值乘以2^CL的结果超出了32位无符号整数的范围,无法完全存放在EAX中;若CF=0,则表示移位无溢出,结果完整保存在EAX里。这和ADD指令用CF判断无符号溢出的逻辑完全一致。移位前预判溢出:
可以先用BT EAX, 32 - CL指令,检查EAX中第32 - CL位(从0开始计数)是否为1。如果该位是1,那么执行SHL EAX, CL后必然会有高位溢出;反之则不会。注意需要先处理CL=0的情况——此时移位无操作,自然不存在溢出。
举个实际例子:
若EAX=0x80000000(32位无符号数最大值的一半),CL=1,执行SHL EAX, CL后,CF会被置1,同时EAX变为0x00000000。显然原始值×2的结果是0x100000000,超出了32位无符号EAX的范围,CF=1直接给出了溢出的信号。
内容的提问来源于stack exchange,提问作者Kolodez
相关产品推荐
相关产品推荐

