如果lv存储长值,且机器为32位,则以下代码:
iv = int(lv & 0xffffffff)
结果是一个long类型的iv,而不是机器的int。
在这种情况下,我如何获得(带符号的)int值?
发布于 2012-02-20 01:13:35
import ctypes
number = lv & 0xFFFFFFFF
signed_number = ctypes.c_long(number).value
发布于 2009-09-03 21:03:04
您使用的是一种高级脚本语言;从本质上讲,您运行的系统的本机数据类型是不可见的。您不能使用这样的代码强制转换为本机带符号int。
如果您知道要将值转换为32位有符号整数--不管是哪种平台--只需使用简单的数学方法进行转换:
iv = 0xDEADBEEF
if(iv & 0x80000000):
iv = -0x100000000 + iv
发布于 2016-05-08 11:17:03
本质上,问题是符号从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
https://stackoverflow.com/questions/1375897
复制相似问题