如何在Python中获取长整型的有符号整数值?
如果lv存储的是一个长整型的值,而你的机器是32位的,那么下面这段代码:
iv = int(lv & 0xffffffff)
会得到一个长整型的结果,而不是机器里的整型。那我该怎么才能得到一个(带符号的)整型值呢?
9 个回答
你正在使用一种高级脚本语言;这意味着你所运行的系统的原生数据类型是看不见的。你不能用这样的代码将数据转换成原生的有符号整数。
如果你知道你想把值转换成一个32位的有符号整数——不管是什么平台——你可以通过简单的数学运算来完成这个转换:
iv = 0xDEADBEEF
if(iv & 0x80000000):
iv = -0x100000000 + iv
简单来说,这个问题是要把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
在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,尤其是当我们刚开始学习编程的时候。比如,有人可能会在使用某个函数时,发现它的表现和预期的不一样。这时候,我们就需要仔细检查代码,看看是不是哪里出了问题。
有时候,问题可能出在我们对某个概念的理解上。比如,某些函数需要特定的输入格式,如果我们没有按照要求提供,就可能导致错误的结果。因此,了解每个函数的使用方法和要求是非常重要的。
另外,编程中还有很多社区和论坛,比如StackOverflow,大家可以在这里提问和分享经验。遇到问题时,搜索一下相关的讨论,可能会找到解决方案或者灵感。
总之,编程是一个不断学习和解决问题的过程,保持耐心,多尝试,多请教,慢慢就会掌握这些技能。
import ctypes
number = lv & 0xFFFFFFFF
signed_number = ctypes.c_long(number).value