【问题标题】:python handles long ints differently on Windows and Unixpython 在 Windows 和 Unix 上以不同方式处理长整数
【发布时间】:2014-03-19 17:19:18
【问题描述】:

自纪元以来的当前毫秒数为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(&lt;long&gt;) 返回一个 long
  • 相同的数字在 Windows 中被视为 long,但在 unix 中被视为 int

我在文档中看不到任何明显的说明这是正确的行为;是否有(正确的)方法可以将 long 转换为 int(即,它可以用于需要 int 参数的方法中)

【问题讨论】:

  • 绕过什么,究竟是什么?您要避免以不同值发生 int/long 转换的什么后果?
  • 请注意,即使您有 64 位 Windows,您仍然可以安装 32 位 Python,这里似乎就是这种情况。
  • 请注意,int(20000000000000000000) 将在 python 32 位和 64 位中返回 long,因为该数字大于 2**64。从intlong 的转换几乎总是静默执行,因为除了操作性能之外,行为不应该有任何显着变化。我不知道在整数类型之间引发OverflowError 的情况。

标签: python


【解决方案1】:

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

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

来自Numeric Types section

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

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

【讨论】:

  • 啊,好吧 - 我很确定我安装了 64 位 python,显然不是!这是我第一次遇到 32 位/64 位问题以找出答案...
  • 也许不幸的是(对我来说),我似乎使用了一个不接受 long 的 C 扩展,因此发现了这个问题
  • Python 的 &lt;int&gt; 内部表示使用 C 的 long 类型。即使在 64 位 Windows 上,Microsoft 也将 C long 定义为 32 位。因此,使用 32 位或 64 位版本的 Windows 并不重要。大多数(全部?)64 位 Unix 系统将 C long 定义为 64 位。从个人经验来看,C long 定义的不同给 C 扩展带来了很多困难。
  • @casevh:啊,所以这毕竟可能是 Windows 问题。
  • @casevh :当我尝试跨平台使用统一代码与 C 扩展接口时,这也给我带来了很多问题。如果您不想依赖 numpy,这可能对您没有帮助,但我发现的解决方法是使用跨平台一致的类​​型 numpy.int32 和 numpy.int64。
猜你喜欢
  • 1970-01-01
  • 2022-09-30
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 2011-02-10
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
相关资源
最近更新 更多