在 Python 中,如何翻译 *(1+(int*)&x)?

In Python, how can I translate *(1+(int*)&x)?

此问题是 . In Sun's math library(C 语言)的后续问题,表达式

*(1+(int*)&x)

用于检索浮点数x的高位字。此处,OS 假定为 64 位,具有小端表示法。

我在想怎么把上面的C表达式翻译成Python?这里的难点在于如何翻译表达式中的'&'和'*'。顺便说一句,也许 Python 有一些内置函数可以检索浮点数的高位字?

您可以使用 struct 更轻松地完成此操作:

high_word = struct.pack('<d', x)[4:8]
return struct.unpack('<i', high_word)[0]

这里,high_word是一个bytes对象(或者2.x中的str),由little中x的四个最高有效字节组成endian 顺序(使用 IEEE 64 位浮点格式)。然后我们将它解压回一个 32 位整数(它在一个单例元组中返回,因此是 [0])。

无论您平台的底层字节顺序如何,这始终对所有内容使用小端。如果您需要使用本机字节顺序,请将 < 替换为 =(并使用 >! 强制使用大字节序)。它还保证 64 位双精度数和 32 位整数,而 C 不保证。您 也可以 删除该保证,但是没有充分的理由这样做,因为这会使您的问题变得荒谬。

虽然这可以通过指针运算来完成,但它会涉及到 ctypes 的混乱,并且从 Python float 到 C float 的转换仍然相对昂贵。 struct 代码更容易阅读。