首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用32位ints和操作数

问使用32位ints和操作数
EN

Stack Overflow用户
提问于 2018-11-03 23:45:22
回答 1查看 2.3K关注 0票数 2

是否有可能在python中覆盖或重载int /numbers的标准实现,从而使其工作起来像32位int。

代码语言:javascript
复制
a: int
a = 4076863488
>>> -218103808

或者,是否可以以某种方式定义一个不能更改类型的变量?做这样的事情:x: int?我之所以想这样做,是因为在每一位操作和分配上编写ctypes.c_int32(n)是很烦人的。特别是因为Python不使用32位按位操作数。

我知道我基本上是在试图改变语言的本质。所以,也许我是在问,如果你必须在python中做32位的事情,你会怎么做。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-04 00:01:39

一些备选方案:

  • 用Cython。您可以在那里声明一个本地32位int类型,甚至可以将纯数字代码编译为(非常)快的C代码。
  • 使用单个元素的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更难工作。
  • 手工咬碎。对于一个没有签名的32位int,这只是一个添加大量& 0xffffffff的问题,这并不是太糟糕。但是,Python没有任何内置的方法可以将值包装为一个带符号的32位int,所以您必须编写自己的int32转换函数并使用它包装所有操作: to_int32( val ):val &= ( (1<<32) -1)如果val & (1<<31):val -= (1<<32)返回val

展示您的选择:

Cython

代码语言:javascript
复制
cpdef int munge(int val):
    cdef int x
    x = val * 32
    x += 0x7fffffff
    return x

保存为int_test.pyx并使用cythonize -a -i int_test.pyx进行编译。

代码语言:javascript
复制
>>> import int_test
>>> int_test.munge(3)
-2147483553

NumPy

代码语言:javascript
复制
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型

代码语言:javascript
复制
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)

固定

代码语言:javascript
复制
import fixedint

def munge(val):
    x = val * 32
    x += 0x7fffffff
    return x

print(munge(fixedint.Int32(3)))
# prints -2147483553
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53136516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档