2016-04-24 2 views
3

0xFFFFFFFFを使用すると、Pythonでint32オーバーフローを検出するためのマスキングが正の数で機能する場合があります。Pythonでマスク0xFFFFFFFFを使用してint32のオーバーフローを検出しますか?

式:Xがoveflowせず、xがしかし、この表現は、例えば、負の整数のために動作しない0

より大きい場合

x & 0xFFFFFFFF == x 

Trueを戻します

-7はINT32範囲をオーバーフローしてはならないのに
(-7 & 0xFFFFFFFF) == -7 

は、Falseを返します。..

このアプローチがなぜ-7で動作しないのか、どのように動作させるのかについてのアイデアは誰にもありますか?

答えて

2

これは、Pythonでは数値の固定幅が考慮されていないためです。だから、C/C++言語(最上位ビット)のような符号ビットはありません。

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

上記の主張の確認:あなたはビット単位のAND負の数と0xffffを行うときに、他の言葉では、結果ではなく、負の数の大きな正の数である

>>> 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 
関連する問題