【问题标题】:Python - bitshifting with 32bit version vs 64bit versionsPython - 32 位版本与 64 位版本的位移
【发布时间】:2021-07-08 10:38:57
【问题描述】:

上下文

我有一个将数据输出到文件中并通过校验和验证数据的应用程序。虽然Python 3.8.0 32bit 一切正常,但我观察到Python 3.8.4 64bit 生成了不同的校验和。根据错误转储的数据,我相信我已将其范围缩小到此代码(因为失败的文件是唯一使用此功能的文件)。

此方法的目的是取一个值,0-65535,并将其拆分为两个单独的“字节”。

def integer_to_lsb_msb(value: int) -> List[int]:

    if value < 0 or value > 65535:
        raise ValueError("The input value does not qualify as a '16bit' value", value)

    lsb = value & 0xFF
    msb = ((value >> 8) & 0xFF)
    return [lsb, msb]

问题

python 不是以独立于架构的方式处理代码吗?如果没有,有没有办法检查架构并运行自定义代码以确保 32 位和 64 位版本的输出相同?

【问题讨论】:

  • 那么向我们展示一个输入,其中两个不同的 Python 版本使用此函数给出不同的结果?
  • Python 的按位运算符是整数运算符,而不是计算机字 - 所以我怀疑您是否有一个将整数发送到整数列表并在不同架构上返回不同值的函数示例。我的猜测是,您所看到的更多地与您 do 对返回值的操作有关(在您未显示的代码中)。如果没有minimal reproducible example,就很难说更多了。
  • 问题的重点不是你解释的那样。我的代码根据我使用的是 32 位还是 64 位版本的 python 生成不同的输出。因此,问题是关于 python 解释器的规则以及这个肩膀是否曾经是这种情况。
  • A minimal reproducible example 将包含一个在不同版本上生成不同输出的短程序。您发布的代码似乎缺少该属性。是否有特定的value print(integer_to_lsb_msb(value)) 在不同的机器上打印不同的东西?如果没有,你为什么还要发布这个功能?
  • 您是否在代码中使用bytes 对象?像int.from_bytes 这样的方法涉及底层细节,在不同的架构上可能表现不同。

标签: python


【解决方案1】:

python 解释器应该独立于架构运行代码。所以你不应该在你的代码中担心它。例如,“所有整数都实现为任意大小的“长”整数对象”(Python Doc)。

但是,如果您加载位数与解释器 (Should I use Python 32bit or Python 64bit) 不同的外部库,例如 Windows 中的 DLL,您可能会遇到问题。

【讨论】:

  • 在 Windows 中,您无法加载位数与解释器不同的 DLL。尝试这样做可能会导致多个错误中的任何一个,例如不是有效的 win32 程序或未找到。但它不会运行并给出意想不到的结果。
猜你喜欢
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 2020-07-31
相关资源
最近更新 更多