diff options
| author | serpilliere <serpilliere@users.noreply.github.com> | 2017-01-14 12:27:22 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-01-14 12:27:22 +0100 |
| commit | 35941c723827ab1d0e8b1fe86894cc188a869dcd (patch) | |
| tree | ea8293629a6d05b13a4f429019afd5da2a616234 | |
| parent | 97d25c6e584e48b4ff85e529da290db34847868e (diff) | |
| parent | 50f6ca146c0b810982ad5b42eea84ee0b6d26f8a (diff) | |
| download | miasm-35941c723827ab1d0e8b1fe86894cc188a869dcd.tar.gz miasm-35941c723827ab1d0e8b1fe86894cc188a869dcd.zip | |
Merge pull request #477 from commial/fix/division
Fix/division
| -rw-r--r-- | miasm2/expression/modint.py | 16 | ||||
| -rw-r--r-- | test/expression/modint.py | 15 |
2 files changed, 24 insertions, 7 deletions
diff --git a/miasm2/expression/modint.py b/miasm2/expression/modint.py index 90dabfac..b6a0e4ee 100644 --- a/miasm2/expression/modint.py +++ b/miasm2/expression/modint.py @@ -41,11 +41,15 @@ class moduint(object): return self.__class__(self.arg & y) def __div__(self, y): + # Python: 8 / -7 == -2 (C-like: -1) + # int(float) trick cannot be used, due to information loss + den = int(y) + num = int(self) + result_sign = 1 if (den * num) >= 0 else -1 + cls = self.__class__ if isinstance(y, moduint): cls = self.maxcast(y) - return cls(int(float(self.arg) / y.arg)) - else: - return self.__class__(int(float(self.arg) / y)) + return ((abs(num) / abs(den)) * result_sign) def __int__(self): return int(self.arg) @@ -64,11 +68,11 @@ class moduint(object): return self.__class__(self.arg << y) def __mod__(self, y): + # See __div__ for implementation choice + cls = self.__class__ if isinstance(y, moduint): cls = self.maxcast(y) - return cls(self.arg - (y.arg * int(float(self.arg)/y.arg))) - else: - return self.__class__(self.arg - (y * int(float(self.arg)/y))) + return cls(self.arg - (y * (self / y))) def __mul__(self, y): if isinstance(y, moduint): diff --git a/test/expression/modint.py b/test/expression/modint.py index e7c19d0c..17c12907 100644 --- a/test/expression/modint.py +++ b/test/expression/modint.py @@ -8,7 +8,7 @@ d = uint1(0) e = uint1(1) f = uint8(0x1) - +g = int8(-3) print a, b, c print a + b, a + c, b + c @@ -53,7 +53,20 @@ assert(f ^ f == 0) assert(f ^ 0 == f) assert(0 ^ f == f) assert(1 ^ f == 0) +assert(c / g == -1) +assert(c / -3 == -1) +assert(c % g == 1) +assert(c % -3 == 1) print e + c, c + e, c - e, e - c print 1000 * a print hex(a) + +define_int(128) +define_uint(128) +h = uint128(0x11223344556677889900AABBCCDDEEFF) +i = int128(-0x9900AABBCCDDEEFF1122334455667788) + +assert(i / h == 6) +assert(i % h == 0x3221aa32bb43cd58d9cc54dd65ee7e) + |