2024-09-27 04:21:38 发布
网友
如果lv存储一个长值,并且机器是32位,则以下代码:
iv = int(lv & 0xffffffff)
结果长型静脉输液,而不是机器的int
在这种情况下,如何获取(有符号的)int值?
您使用的是高级脚本语言;从本质上讲,您运行的系统的本机数据类型是不可见的。不能使用这样的代码强制转换为本机签名int。
如果知道要将值转换为32位有符号整数(无论平台如何),只需使用简单的数学运算即可完成转换:
iv = 0xDEADBEEF if(iv & 0x80000000): iv = -0x100000000 + iv
import ctypes number = lv & 0xFFFFFFFF signed_number = ctypes.c_long(number).value
本质上,问题是符号从32位扩展到。。。无限位数,因为Python有任意大的整数。通常,符号扩展是在强制转换时由CPU指令自动完成的,因此有趣的是,在Python中这比在C中更难实现
通过四处玩弄,我发现了一些类似于BreizhGatch函数的东西,但这不需要条件语句。n & 0x80000000提取32位符号位;然后,-保持相同的32位表示,但符号扩展它;最后,扩展符号位设置在n。
n & 0x80000000
-
n
def toSigned32(n): n = n & 0xffffffff return n | (-(n & 0x80000000))
Bit Twiddling Hacks提出了另一种可能更通用的解决方案。n ^ 0x80000000翻转32位符号位;然后- 0x80000000将符号扩展到相反的位。另一种思考方法是,最初负数高于正数(用0x80000000分隔);然后^交换它们的位置;然后-将负数移到0以下。
n ^ 0x80000000
- 0x80000000
0x80000000
^
def toSigned32(n): n = n & 0xffffffff return (n ^ 0x80000000) - 0x80000000
您使用的是高级脚本语言;从本质上讲,您运行的系统的本机数据类型是不可见的。不能使用这样的代码强制转换为本机签名int。
如果知道要将值转换为32位有符号整数(无论平台如何),只需使用简单的数学运算即可完成转换:
本质上,问题是符号从32位扩展到。。。无限位数,因为Python有任意大的整数。通常,符号扩展是在强制转换时由CPU指令自动完成的,因此有趣的是,在Python中这比在C中更难实现
通过四处玩弄,我发现了一些类似于BreizhGatch函数的东西,但这不需要条件语句。
n & 0x80000000
提取32位符号位;然后,-
保持相同的32位表示,但符号扩展它;最后,扩展符号位设置在n
。Bit Twiddling Hacks提出了另一种可能更通用的解决方案。
n ^ 0x80000000
翻转32位符号位;然后- 0x80000000
将符号扩展到相反的位。另一种思考方法是,最初负数高于正数(用0x80000000
分隔);然后^
交换它们的位置;然后-
将负数移到0以下。相关问题 更多 >
编程相关推荐