Python Long类型与C‘Long Long’的比较?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (339)

我想将一个值表示为64位有符号长,使得大于(2 ** 63)-1的值表示为负数,但Python long具有无限精度。 有没有快速的方式来实现这一目标?

提问于
用户回答回答于

你可以用ctypes.c_longlong:

>>> from ctypes import c_longlong as ll
>>> ll(2 ** 63 - 1)
c_longlong(9223372036854775807L)
>>> ll(2 ** 63)
c_longlong(-9223372036854775808L)
>>> ll(2 ** 63).value
-9223372036854775808L

这真是如果你确实知道signed long long目标机器上的64位宽。

用户回答回答于

最快的方法可能是自己将结果截断为64位:

def to_int64(n):
    n = n & ((1 << 64) - 1)
    if n > (1 << 63) - 1:
        n -= 1 << 64
    return n

当然,你可以定义自己的数字类型,在每次执行任何类型的算术操作时都会自动执行此操作:

class Int64:
    def __init__(self, n):
        if isinstance(n, Int64):
            n = n.val
        self.val = to_int64(n)

    def __add__(self, other):
        return Int64(self.val + other)

    def __radd__(self, other):
        return Int64(other + self.val)

    def __sub__(self, other):
        return Int64(self.val - other)

    ...

扫码关注云+社区

领取腾讯云代金券