Jason S
Jason S

Reputation: 189626

python 32-bit and 64-bit integer math with intentional overflow

What's the best way to do integer math in 32- and 64-bit, so that overflow happens like it does in C?

e.g. (65536*65536+1)*(65536*65536+1) should be 0x0000000200000001 in 64-bit math, and not its exact value (non-overflowing) 0x10000000200000001.

Upvotes: 22

Views: 49549

Answers (2)

dawg
dawg

Reputation: 103714

Use NumPy with the appropriate integer size and the overflow is more C like:

32 bit:

>>> np.uint32(2**32-3) + np.uint32(5)
__main__:1: RuntimeWarning: overflow encountered in uint_scalars
2

64 bit:

>>> i64=np.uint64(65536*65536+1)
>>> hex(i64*i64)
'0x200000001L'

Compare with Python's native int:

>>> hex((65536*65536+1)*(65536*65536+1))
'0x10000000200000001L'

You can see that NumPy is doing as you desire.

Upvotes: 16

martineau
martineau

Reputation: 123393

Just & the result with the appropriate 32- or 64-bit mask (0xffffffff or 0xffffffffffffffff).

Upvotes: 34

Related Questions