2016-04-24 52 views
3

我发现使用0xFFFFFFFF掩码来检测Python中的int32溢出可能适用于正数。在Python中使用0xFFFFFFFF掩码检测int32溢出?

表达:

x & 0xFFFFFFFF == x 

将返回True如果x不oveflow并且x是大于0

然而,该表达式负整数不起作用,例如:

(-7 & 0xFFFFFFFF) == -7 

将返回False,虽然-7不得超出INT32范围..

有没有人有关于为什么这种方法不适用于-7以及如何使其工作的想法?

回答

2

这是因为Python不考虑数字的固定宽度。所以你没有任何符号位,就像我们对C/C++语言(最重要的位)。在换句话说,当你做一个位与负数和0xffff之间,结果是一个很大的正数而不是负数:

>>> print(-7 & 0xFFFF) 
65529 
>>> print(-7 & 0xFFFFFFFF) 
4294967289 
>>> 

确认了上述要求:

>>> x = -1 
>>> y = -2 
>>> z = -4 
>>> x.bit_length() 
1 
>>> y.bit_length() 
2 
>>> z.bit_length() 
3 
>>> 

虽然C/C++语言作为我们为数字的固定宽度

#include <iostream> 
#include <string> 

int main() 
{ 
    int i = -7 & 0xFFFFFFFF; 
    std::cout << i; 
} 

输出是一样的负数(如果我们选择了&运营商的右侧正确长度):

-7 

我猜你需要定义一个函数来瞄准你的目标和传递数字与长度(例如4字节或8字节)。

事情是这样的:

>>> def isOverflow(num, width=32): 
    if num > 0 and num > 2**(width-1) -1 : 
     return True 
    elif num < 0 and abs(num) > 2**(width-1): 
     return True 
    return False 

还是较为有效的版本:

def isOverflow(num, width=32): 
    if num > 0: 
     if num >> width-1: 
      return True 
    elif num < 0: 
     if abs(num) > (1 << width - 1): 
      return True 
    return False 

在于按如下工作:

>>> ================================ RESTART ================================ 
>>> 
>>> isOverflow(-129,8) 
True 
>>> isOverflow(-128,8) 
False 
>>> isOverflow(128,8) 
True 
>>> isOverflow(127,8) 
False 
>>> isOverflow(0x7fffffff) 
False 
>>> isOverflow(0x8fffffff) 
True