是否有可能在python中覆盖或重载int /numbers的标准实现,从而使其工作起来像32位int。
a: int
a = 4076863488
>>> -218103808或者,是否可以以某种方式定义一个不能更改类型的变量?做这样的事情:x: int?我之所以想这样做,是因为在每一位操作和分配上编写ctypes.c_int32(n)是很烦人的。特别是因为Python不使用32位按位操作数。
我知道我基本上是在试图改变语言的本质。所以,也许我是在问,如果你必须在python中做32位的事情,你会怎么做。
发布于 2018-11-04 00:01:39
一些备选方案:
numpy数组:np.zeros((1,), dtype=np.int32)。如果您只使用就地操作(+=、*=等),这将像32位int类型一样工作。请注意,如果您曾经使用过常规二进制运算符(例如myint + 3),您可能会受到类型提升或转换的影响,其结果将不再是int32。ctypes.c_int32。这是内置于Python的,但不支持任何数学操作,因此您必须自己包装和展开(例如newval = c_int32(v1.value + v2.value))。fixedint (无耻的插头)这样的库,它提供固定整数类,通过操作保持固定大小,而不是衰减到int。fixedint是专门设计的,考虑到固定宽度的按位数学。在这种情况下,您将使用fixedint.Int32。一些不太理想的选择:
struct:如果输入超出范围,则抛出错误。您可以使用unpack('i', pack('I', val & 0xffffffff))[0]来解决这个问题,但这实在是太麻烦了。array:如果您试图存储超出范围的值,则会引发错误。比struct更难工作。& 0xffffffff的问题,这并不是太糟糕。但是,Python没有任何内置的方法可以将值包装为一个带符号的32位int,所以您必须编写自己的int32转换函数并使用它包装所有操作:
to_int32( val ):val &= ( (1<<32) -1)如果val & (1<<31):val -= (1<<32)返回val展示您的选择:
Cython
cpdef int munge(int val):
cdef int x
x = val * 32
x += 0x7fffffff
return x保存为int_test.pyx并使用cythonize -a -i int_test.pyx进行编译。
>>> import int_test
>>> int_test.munge(3)
-2147483553NumPy
import numpy as np
def munge(val):
x = val.copy()
x *= 32
x += 0x7fffffff
return x
def to_int32(val):
return np.array((val,), dtype=np.int32)
print(munge(to_int32(3)))
# prints [-2147483553]C型
from ctypes import c_int32
def munge(val):
x = c_int32(val.value * 32)
x = c_int32(x.value + 0x7fffffff)
return x
print(munge(c_int32(3)))
# prints c_int(-2147483553)固定
import fixedint
def munge(val):
x = val * 32
x += 0x7fffffff
return x
print(munge(fixedint.Int32(3)))
# prints -2147483553https://stackoverflow.com/questions/53136516
复制相似问题