C python中的溢出int
我正在将Ian Bell的一部分精英从C转换为Python。C(ab)使用16位整数,这会导致溢出。Python使用神奇的Python整数,而不是。这是一个问题 我可以定义一个C python中的溢出int,c,python-3.x,porting,integer-overflow,C,Python 3.x,Porting,Integer Overflow,我正在将Ian Bell的一部分精英从C转换为Python。C(ab)使用16位整数,这会导致溢出。Python使用神奇的Python整数,而不是。这是一个问题 我可以定义一个类UInt16:(更新:或使用ctype内置的UInt16),它的行为就像我希望的那样,但是我必须“强制”整个程序中的每个数字都是UInt16。我有没有办法告诉我的解释器“嘿,你知道Int?好吧,我想让你在你通常使用的每个地方都使用这个类。” 或者,如果做不到这一点,是否还有另一种简单的方法可以实现整数溢出?简短回答:不可
类UInt16:
(更新:或使用ctype内置的UInt16),它的行为就像我希望的那样,但是我必须“强制”整个程序中的每个数字都是UInt16
。我有没有办法告诉我的解释器“嘿,你知道Int
?好吧,我想让你在你通常使用的每个地方都使用这个类。”
或者,如果做不到这一点,是否还有另一种简单的方法可以实现整数溢出?简短回答:不可能按照您的意愿覆盖默认整数行为
更长的回答: 首先,我们可以看到Python中存在几种16位无符号整数的实现:
ctypes
16位无符号整数作为c\u uint16
unint16
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'>
在这种情况下,不会调用
int
方法,而是简单地将b
赋值为1
。我们希望做的是覆盖此行为,但不幸的是。简短回答:不可能像您希望的那样覆盖默认整数行为
更长的回答: 首先,我们可以看到Python中存在几种16位无符号整数的实现:
ctypes
16位无符号整数作为c\u uint16
unint16
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'>
在这种情况下,不会调用
int
方法,而是简单地将b
赋值为1
。我们希望做的是也覆盖这种行为,但不幸的是。AFAIR这是不可能的。您希望使用内置类型,即
扩展版
整数文本(1,而不是int(“1”))始终是内置模块
/\uuuu内置模块中的int类型(取决于python版本)。您要做的基本上是将unint16
上的所有方法复制到int类(因为方法只是函数类型的属性)。在本例中,在您声明1的每个地方,都会得到一个类型为int
的对象,其行为与unint16
类似
这在python中是不可能的。我认为,由于这一点,底层实现变得越来越容易,但这背后有更深层次的逻辑
int
是一个核心类,如list
,str
,object
,set
,dict
,tuple
,等等。假设有人创建了几乎所有人都会使用的非常方便的库。如果您曾经使用过Java,那么想象一下它对ApacheCommons或Spring的影响。事实上,每个有价值的人都会使用它,因为它使开发更快。现在,假设有人创建了fork,在他的公司内部使用,说他这样做是为了保持代码库的稳定,它有一小段代码,可以改变内置的对象行为,从而向他发送一些关键数据。他可以利用数百万用户的私人数据(地址、密码等等)欺骗他们。令人毛骨悚然的场景,对吧
现在,这似乎不是很真实,但如果让最终用户评估python脚本呢?您可能见过内置python shell的文本编辑器(如gedit)或音乐播放器(Rhythmbox),为程序内部提供接口。现在,soemone以某种方式将对象的变化行为注入到您的机器中。另一个令人毛骨悚然的场景
这些都是我想到的例子,我真的不记得python的创建者对它说了什么——这就是为什么我提供了进一步讨论的链接
有点离题——这实际上可能导致一些优秀的库(“这”意味着“允许在内置程序上进行猴子补丁”)。想象一下,monkey修补所有Bultin,以便将它们存储在某个多处理管理器中。实际上,您可以获得基于多处理的java风格的多线程,并且可以以某种方式避免GIL。当然,还有很多其他原因说明这不是很好(“例如,多线程的幻觉不是多线程”),但我发现它对于简单的日常桌面脚本编写非常有用 那是不可能的。您希望使用内置类型,即
扩展版
整数文本(1,而不是int(“1”))始终是内置模块
/\uuuu内置模块中的int类型(取决于python版本)。您要做的基本上是将unint16
上的所有方法复制到int类(因为方法只是函数类型的属性)。在这种情况下,在你所说的每一个地方,你都会得到一个典型的对象