Python在Windows和Unix上处理长整型的方式不同。

4

当前自纪元以来的毫秒数为1395245378429;在Unix(64位/Ubuntu/Python 2.7)上,您可以执行以下操作:

>>> t = 1395245378429
>>> type(t)
<type 'int'>
>>> t = 1395245378429L
>>> type(t)
<type 'long'>
>>> int(t)
1395245378429
>>> type(int(t)
<type 'int'>

但在Windows上(也适用于64位/Python 2.7),会出现以下情况:
>>> t = 1395245378429
>>> type(t)
<type 'long'>
>>> int(t)
1395245378429L
>>> type(int(t))
<type 'long'>

以下是一些奇怪的观察结果:

  • 在Windows上,int(<long>)返回一个长整型
  • 相同的数字在Windows上被视为长整型,在Unix上则为整型

我在文档中没有看到明确说明这是正确的行为;是否有(正确的)方法将长整型转换为整型(即可用于需要整型参数的方法)。


你到底想避免什么,确切地说?你试图避免在不同值处发生的int/long转换所带来的后果是什么? - DSM
2
请注意,即使您使用的是64位Windows系统,您仍然可以安装32位Python版本,这似乎就是这里的情况。 - Scott Griffiths
请注意,在Python 32位和64位中,int(20000000000000000000)将返回一个long,因为该数字大于2 ** 64。从intlong的转换几乎总是会默默地执行,因为除了操作性能之外,行为上不应该有任何显着变化。我不知道是否存在在整数类型之间引发OverflowError的情况。 - Bakuriu
1个回答

6
Python使用C语言的long作为int类型,即使在Windows上也仅限于32位。您可以通过检查sys.maxint来查看平台当前的最大本机int大小:

Python常规整数类型支持的最大正整数。这至少是2 ** 31-1。最大负整数是-maxint-1 - 这种不对称性是由于使用2的补码二进制算术所导致的。

并且从数字类型部分中获得:

普通整数(也称为整数)使用C中的long实现,这给它们至少32位的精度(sys.maxint始终设置为当前平台的最大普通整数值,最小值为-sys.maxint - 1)。

除非你直接与不支持Python long类型的C扩展库进行交互,否则无需担心Python何时使用int以及何时需要使用long。在Python 3中,独立的long类型已完全删除。


啊,好的 - 我很确定我已经安装了64位的Python,显然不是这样!而且这是我第一次遇到32位/64位问题去解决... - ChrisW
也许不幸的是(对我来说),我似乎正在使用一个不接受长整型的C扩展,因此发现了这个问题。 - ChrisW
1
Python内部表示<int>使用C长整型。即使在64位Windows上,Microsoft也将C长定义为32位。因此,您使用32位或64位版本的Windows都无关紧要。大多数(全部?)64位Unix系统将C长定义为64位。从个人经验来看,C长的定义差异会导致许多C扩展方面的困难。 - casevh
1
@casevh:啊,这或许真的是一个Windows问题。 - Martijn Pieters
@casevh:这也给我带来了很多问题,当我尝试在不同平台上使用统一的代码与C扩展进行接口时。如果您不想依赖于numpy,这可能对您没有帮助,但我发现的解决方法是使用在各个平台上保持一致的类型numpy.int32和numpy.int64。 - YassineA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接