如何在Python中获取长整型的有符号整数值?

36 投票
9 回答
77439 浏览
提问于 2025-04-15 14:03

如果lv存储的是一个长整型的值,而你的机器是32位的,那么下面这段代码:

iv = int(lv & 0xffffffff)

会得到一个长整型的结果,而不是机器里的整型。那我该怎么才能得到一个(带符号的)整型值呢?

9 个回答

22

你正在使用一种高级脚本语言;这意味着你所运行的系统的原生数据类型是看不见的。你不能用这样的代码将数据转换成原生的有符号整数。

如果你知道你想把值转换成一个32位的有符号整数——不管是什么平台——你可以通过简单的数学运算来完成这个转换:

iv = 0xDEADBEEF
if(iv & 0x80000000):
    iv = -0x100000000 + iv
26

简单来说,这个问题是要把32位的数字扩展到...无限位,因为Python可以处理任意大小的整数。通常情况下,当我们在计算机中转换数据类型时,CPU会自动处理符号扩展,所以在Python中这比在C语言中要复杂一些,挺有意思的。

我试着玩了一下,发现了一种类似于BreizhGatch函数的方法,但不需要使用条件语句。n & 0x80000000可以提取出32位的符号位;然后,使用-可以保持相同的32位表示,同时进行符号扩展;最后,把扩展后的符号位设置到n上。

def toSigned32(n):
    n = n & 0xffffffff
    return n | (-(n & 0x80000000))

Bit Twiddling Hacks提供了另一种可能更通用的解决方案。n ^ 0x80000000会翻转32位的符号位;然后- 0x80000000会对相反的位进行符号扩展。可以这样理解,最开始,负数在正数的上面(用0x80000000分开);^操作会交换它们的位置;然后-操作会把负数移到0以下。

def toSigned32(n):
    n = n & 0xffffffff
    return (n ^ 0x80000000) - 0x80000000
35

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,尤其是当我们刚开始学习编程的时候。比如,有人可能会在使用某个函数时,发现它的表现和预期的不一样。这时候,我们就需要仔细检查代码,看看是不是哪里出了问题。

有时候,问题可能出在我们对某个概念的理解上。比如,某些函数需要特定的输入格式,如果我们没有按照要求提供,就可能导致错误的结果。因此,了解每个函数的使用方法和要求是非常重要的。

另外,编程中还有很多社区和论坛,比如StackOverflow,大家可以在这里提问和分享经验。遇到问题时,搜索一下相关的讨论,可能会找到解决方案或者灵感。

总之,编程是一个不断学习和解决问题的过程,保持耐心,多尝试,多请教,慢慢就会掌握这些技能。

import ctypes

number = lv & 0xFFFFFFFF

signed_number = ctypes.c_long(number).value

撰写回答