c - python 中的整数溢出

标签 c python-3.x porting integer-overflow

我正在将 Ian Bell 的《精英》的一段内容从 C 转换为 Python。 C(ab)使用16位整数,会溢出。 Python 使用神奇的 Python 整数,但实际上却没有。这是一个问题。

我可以定义一个 class UInt16: (更新:或者使用 UInt16 中内置的 ctype),它的行为就像我想要的那样,但随后我必须“强制”中的每个数字整个程序是 UInt16。我有什么办法可以告诉我的解释器“嘿,你知道Int吗?好吧,我希望你在你通常会使用其中一个类的每个地方都使用这个类。”

或者,如果做不到这一点,是否有另一种简单的方法可以实现整数溢出?

最佳答案

简短回答:无法按照您的意愿覆盖默认的整数行为。


更长的答案:

首先,我们可以看到Python中存在几种16位无符号整数的实现:

  1. 在内置库 ctypes 中,16 位无符号整数可用作 c_uint16
  2. Numpy 库还包含 unint16
  3. 实现您自己的 uint16 数据类型(使用运算符重载等)

我们是否可以使用这些或其他一些数据类型来覆盖 Python 中的默认整数,这个问题比较棘手。

假设用户使用 int 方法创建程序中的所有整数。如果是这种情况,那么我们可以包装 int 方法来创建无符号整数而不是常规整数:

from ctypes import c_uint16
_int = int

def int(x):
    return c_uint16(x)

例如,以下代码可以正常工作:

a = int(1)

我们可以检查:

>>> type(a)
<class 'ctypes.c_ushort'>

问题来了:

b = 1

在这种情况下,不会调用 int 方法,而是简单地为 b 分配值 1。我们希望做的就是覆盖这种行为,但不幸的是 it is not possible .

关于c - python 中的整数溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23858626/

相关文章:

c - 如何有条件地在宏中包含 #ident 指令?

在 C 中使用递归创建二叉树

根目录下和我的项目记录器之上的层次结构中的 Python 记录器?

java - 将 Java 移植到 Python 的更好方法?

c# - 将 C# Func<> 移植到 Java- Math Equation

c - 如何将文本文件的行读入 C 中的大字符串?

c - 如何使用 CAP_SYS_ADMIN

python - 从 3.6 更新后无法为 python 3.7 安装 pip

Python:三重双引号字符串格式

c++ - 在 Windows 上编译+分发 Linux 代码